array:7 [
"request" => Illuminate\Http\Request {#51
#json: null
#convertedFiles: null
#userResolver: Closure($guard = null) {#967 …4}
#routeResolver: Closure() {#971 …4}
+attributes: Symfony\Component\HttpFoundation\ParameterBag {#53}
+request: Symfony\Component\HttpFoundation\ParameterBag {#59}
+query: Symfony\Component\HttpFoundation\ParameterBag {#59}
+server: Symfony\Component\HttpFoundation\ServerBag {#55}
+files: Symfony\Component\HttpFoundation\FileBag {#56}
+cookies: Symfony\Component\HttpFoundation\ParameterBag {#54}
+headers: Symfony\Component\HttpFoundation\HeaderBag {#57}
#content: null
#languages: null
#charsets: null
#encodings: null
#acceptableContentTypes: array:1 [
0 => "*/*"
]
#pathInfo: "/torrot_detail/sliderproduct-detail"
#requestUri: "/torrot_detail/sliderproduct-detail?sliderproduct=85"
#baseUrl: ""
#basePath: null
#method: "GET"
#format: null
#session: Illuminate\Session\Store {#1063}
#locale: null
#defaultLocale: "en"
-preferredFormat: null
-isHostValid: true
-isForwardedValid: true
basePath: ""
format: "html"
}
"id" => "sliderproduct-detail"
"title" => array:1 [
"pageTitle" => "website.Career"
]
"result" => array:1 [
"commonContent" => array:23 [
"currency" => {#1357}
"top_offers" => {#1369}
"menus" => array:9 [
0 => {#1342}
1 => {#1373}
2 => {#1339}
3 => {#1313}
4 => {#1160}
5 => {#1302}
6 => {#1314}
7 => {#1159}
8 => {#1116}
]
"menusRecursive" => """
<li class="nav-item dropdown AboutUs-menu"><a href="/about" >About Us</a></li><li class="nav-item dropdown MXkids-menu"><a href="javascript:" >MX kids</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:">\n
Torrot Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/1">\n
SUPERMOTARD ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/11">\n
SUPERMOTARD TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/3">\n
MOTOCROSS ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/2">\n
MOTOCROSS TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/5">\n
TRIAL ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/4">\n
TRIAL TWO\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/torrot">Show More</a></li></ul></li><li class="nav-item dropdown MXBikes-menu"><a href="#" >MX Bikes</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Drillone Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">\n
Drillone Enduro\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Talaria Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">\n
Talaria Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
BHR Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/bhr_bikes">\n
BHR Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/bhr_bikes">Show More</a></li></ul></li><li class="nav-item dropdown E-Bikes-menu"><a href="https://emxmotors.com/#our-collection-sec" >E-Bikes</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Urbet Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=69">\n
Urbet Nura\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=70">\n
Urbet Gadiro\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=71">\n
Urbet Ego\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=72">\n
Urbet Riazor\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=urbet-bikes">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Delfast Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">\n
Delfast Top 3.0\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Silverback\n
</a>\n
<a class="show-more-btn" href="javascript:">Coming Soon</a></li></ul></li><li class="nav-item dropdown E-scooters-menu"><a href="javascript:;" >E-scooters</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Fidico E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">\n
Black Knight ( 11-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">\n
Black Knight ( 11-45Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">\n
Black Knight ( 11P-40Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">\n
Black Knight ( 11P-60Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">\n
Light Speed ( 13-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">\n
Light Speed (13-60AH)\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=fidico-escooters">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Nami E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=95">\n
Nami Burn E\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=96">\n
Burn E-2 Max\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=nami">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Numo E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">\n
Slack\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">Show More</a></li></ul></li><li class="nav-item dropdown Products-menu"><a href="https://emxmotors.com/products" >Products</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=helmets">\n
Helmets\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/sb-34-zorro-white">\n
SB-34 zorro white\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/blade-helmet">\n
blade helmet\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=helmets">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=accessories">\n
Accessories\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/gloves">\n
gloves\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/shoes">\n
Shoes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=accessories">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=mod-shop">\n
Mod Shop\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/ebmx">\n
EBMX\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
KO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Kaniwaba\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=mod-shop">Show More</a></li></ul></li><li class="nav-item dropdown Services-menu"><a href="javascript:;" >Services</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-repairing-services">\n
e-bike repairing services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-and-e-motor-services">\n
e-bike and e-motor services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-services">\n
custom e-bike services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=ride-testing-experience">\n
ride testing experience\n
</a>\n
</ul></li><li class="nav-item dropdown Blogs-menu"><a href="http://emxmotors.com/blogs" >Blogs</a></li><li class="nav-item dropdown Contact-menu"><a href="/contact" >Contact</a></li>
"""
"menusRecursiveMobile" => """
<li class="nav-item dropdown "><a class="nav-link " href="https://emxmotors.com//about" >About Us</a></li><li class="nav-item dropdown "><a class="nav-link dropdown-toggle" href="javascript:" >MX kids</a><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:">\n
Torrot Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/1">\n
SUPERMOTARD ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/11">\n
SUPERMOTARD TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/3">\n
MOTOCROSS ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/2">\n
MOTOCROSS TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/5">\n
TRIAL ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/4">\n
TRIAL TWO\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/torrot">Show More</a></li></div></li><li class="nav-item dropdown "><a class="nav-link dropdown-toggle" href="https://emxmotors.com/#" >MX Bikes</a><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Drillone Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">\n
Drillone Enduro\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Talaria Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">\n
Talaria Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
BHR Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/bhr_bikes">\n
BHR Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/bhr_bikes">Show More</a></li></div></li><li class="nav-item dropdown "><a href="javascript:">E-Bikes</a><ul class="sub-menu"><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=black-knight">Black Knight</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">BlackKnight BK11P-60Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">BlackKnight BK11P-40Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">BlackKnight BK11-45Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">BlackKnight BK11-40AH</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">delfast bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">DELFAST Top 3.0</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">drillone bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">Drillone Enduro</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=fidico-escooters">Fidico E-scooters</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=87">Lightspeed Knight</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=86">Black Knight</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">Lightspeed LK13-60AH</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">Lightspeed LK13-40AH</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">BlackKnight BK11P-60Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">BlackKnight BK11P-40Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">BlackKnight BK11-45Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">BlackKnight BK11-40AH</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=lightspeed">Lightspeed</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">Lightspeed LK13-60AH</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">Lightspeed LK13-40AH</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=nami">Nami</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=96">Nami Burn E-2 Max</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=95">Nami Burn E</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=numo">Numo</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">NUMO Core 920R</a></li></ul></li><li class="nav-item dropdown"><a href="javascript:">Silverback Bikes</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=talaria">Talaria Bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">Talaria Bikes</a></li></ul></li><li class="nav-item dropdown"><a href="javascript:">TORROT BIKES</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=urbet-bikes">urbet bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=69">urbet nura</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=72">urbet riazor</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=71">urbet ego</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=70">urbet gadiro</a></li></ul></li></ul></li><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Urbet Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=69">\n
Urbet Nura\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=70">\n
Urbet Gadiro\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=71">\n
Urbet Ego\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=72">\n
Urbet Riazor\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=urbet-bikes">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Delfast Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">\n
Delfast Top 3.0\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Silverback\n
</a>\n
<a class="show-more-btn" href="javascript:">Coming Soon</a></li></div></li><li class="nav-item dropdown "><a class="nav-link dropdown-toggle" href="https://emxmotors.com/javascript:;" >E-scooters</a><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Fidico E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">\n
Black Knight ( 11-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">\n
Black Knight ( 11-45Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">\n
Black Knight ( 11P-40Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">\n
Black Knight ( 11P-60Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">\n
Light Speed ( 13-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">\n
Light Speed (13-60AH)\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=fidico-escooters">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Nami E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=95">\n
Nami Burn E\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=96">\n
Burn E-2 Max\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=nami">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Numo E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">\n
Slack\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">Show More</a></li></div></li><li class="nav-item dropdown"><a href="javascript:">Products</a><ul class="sub-menu"><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=helmets" >Helmets</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/blade-helmet">Blade Helmet</a></li><li class="nav-item dropdown"><a href="product-detail/sb-34-zorro-white">SB-34 ZORRO WHITE</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=accessories" >Accessories</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/gloves">Gloves</a></li><li class="nav-item dropdown"><a href="product-detail/shoes">Shoes</a></li></ul></li></ul><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=helmets">\n
Helmets\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/sb-34-zorro-white">\n
SB-34 zorro white\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/blade-helmet">\n
blade helmet\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=helmets">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=accessories">\n
Accessories\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/gloves">\n
gloves\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/shoes">\n
Shoes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=accessories">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=mod-shop">\n
Mod Shop\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/ebmx">\n
EBMX\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
KO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Kaniwaba\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=mod-shop">Show More</a></li></div></li><li class="nav-item dropdown"><a href="javascript:">Services</a><ul class="sub-menu"><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=helmets" >Helmets</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/blade-helmet">Blade Helmet</a></li><li class="nav-item dropdown"><a href="product-detail/sb-34-zorro-white">SB-34 ZORRO WHITE</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=accessories" >Accessories</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/gloves">Gloves</a></li><li class="nav-item dropdown"><a href="product-detail/shoes">Shoes</a></li></ul></li></ul><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-repairing-services">\n
e-bike repairing services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-and-e-motor-services">\n
e-bike and e-motor services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-services">\n
custom e-bike services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=ride-testing-experience">\n
ride testing experience\n
</a>\n
</div></li><li class="nav-item dropdown "><a class="nav-link " href="https://emxmotors.com/http://emxmotors.com/blogs" >Blogs</a></li><li class="nav-item dropdown "><a class="nav-link " href="https://emxmotors.com//contact" >Contact</a></li>
"""
"newsCategories" => array:5 [
0 => {#1185}
1 => {#1148}
2 => {#1404}
3 => {#1306}
4 => {#1241}
]
"featuredNews" => array:4 [
"success" => "1"
"news_data" => array:3 [
0 => {#1267}
1 => {#1265}
2 => {#1239}
]
"message" => "Returned all news."
"total_record" => 3
]
"testimonial" => array:4 [
0 => {#1131}
1 => {#1280}
2 => {#1377}
3 => {#1126}
]
"cart" => []
"setting" => Illuminate\Support\Collection {#1220}
"settings" => array:128 [
"facebook_app_id" => "FB_CLIENT_ID"
"facebook_secret_id" => "FB_SECRET_KEY"
"facebook_login" => "0"
"contact_us_email" => "emx.motorsme@gmail.com"
"address" => "USA - 100 N Central Expressway 613, Richardson, TX 75080 ."
"city" => ""
"state" => ""
"zip" => "71000"
"country" => "United Arab Emirates"
"latitude" => "(04) 345 0700"
"longitude" => "Longitude"
"phone_no" => "+971 56 555 2200"
"fcm_android" => ""
"fcm_ios" => null
"fcm_desktop" => null
"website_logo" => "images/media/2022/01/T2Fqj03409.png"
"fcm_android_sender_id" => null
"fcm_ios_sender_id" => ""
"app_name" => "EMX Motors"
"currency_symbol" => "$"
"new_product_duration" => "20"
"notification_title" => "Ionic Ecommerce"
"notification_text" => "A bundle of products waiting for you!"
"lazzy_loading_effect" => "Detail"
"footer_button" => "1"
"cart_button" => "1"
"featured_category" => null
"notification_duration" => "year"
"home_style" => "1"
"wish_list_page" => "1"
"edit_profile_page" => "1"
"shipping_address_page" => "1"
"my_orders_page" => "1"
"contact_us_page" => "1"
"about_us_page" => "1"
"news_page" => "1"
"intro_page" => "1"
"setting_page" => "1"
"share_app" => "1"
"rate_app" => "1"
"site_url" => "URL"
"admob" => "0"
"admob_id" => "ID"
"ad_unit_id_banner" => "Unit ID"
"ad_unit_id_interstitial" => "Indestrial"
"category_style" => "4"
"package_name" => "package name"
"google_analytic_id" => "test"
"themes" => "themeone"
"company_name" => "#"
"facebook_url" => "https://www.facebook.com/emxmotorsuae/"
"google_url" => "https://www.youtube.com/channel/UC92lCaRzfimi_Hrw3MQo7TQ"
"twitter_url" => "https://www.twitter.com"
"linked_in" => "https://www.instagram.com/emxmotorsme/"
"default_notification" => "onesignal"
"onesignal_app_id" => "6053d948-b8f6-472a-87e4-379fa89f78d8"
"onesignal_sender_id" => ""
"ios_admob" => "0"
"ios_admob_id" => "AdMob ID"
"ios_ad_unit_id_banner" => "Unit ID Banner"
"ios_ad_unit_id_interstitial" => "ID Interstitial"
"google_login" => "0"
"google_app_id" => null
"google_secret_id" => null
"google_callback_url" => null
"facebook_callback_url" => null
"is_app_purchased" => "0"
"is_web_purchased" => "1"
"consumer_key" => "dadb7a7c1557917902724bbbf5"
"consumer_secret" => "3ba77f821557917902b1d57373"
"order_email" => "emx.motorsme@gmail.com"
"website_themes" => "1"
"seo_title" => "EMX Motors LLC | Electric motorbikes in Dubai UAE"
"seo_metatag" => "Bikes, electronic bikes, emx motors, emx,"
"seo_keyword" => "Bikes, electronic bikes, emx motors, emx,"
"seo_description" => "<p><span id=\"docs-internal-guid-7fcec0c0-7fff-c729-66ef-aaaf235acf73\"></span></p><p dir=\"ltr\" style=\"line-height:1.38;margin-top:0pt;margin-bottom:10pt;\"><span style=\"font-size: 12pt; font-family: Calibri, sans-serif; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; background-color: rgb(255, 255, 255);\"><font color=\"#000000\" style=\"\">EMX Motors LLC deals with a wide range of electric motorbikes in Dubai. Check out our finest bike collections and get them now.</font></span></p>"
"before_head_tag" => ""
"end_body_tag" => "name"
"sitename_logo" => "logo"
"website_name" => "EMX Motors"
"web_home_pages_style" => "two"
"web_color_style" => "app"
"free_shipping_limit" => "400"
"app_icon_image" => "icon"
"twilio_status" => "0"
"twilio_authy_api_id" => ""
"favicon" => "images/media/2021/11/uoPj528203.png"
"Thumbnail_height" => "150"
"Thumbnail_width" => "150"
"Medium_height" => "400"
"Medium_width" => "400"
"Large_height" => "900"
"Large_width" => "900"
"environmentt" => "local"
"maintenance_text" => "Website is under maintenance"
"package_charge_taxt" => "0"
"order_commission" => "0"
"all_items_price_included_tax" => "yes"
"all_items_price_included_tax_value" => "0"
"driver_accept_multiple_order" => "1"
"min_order_price" => "20"
"youtube_link" => "0"
"external_website_link" => "https://EMX Motors L.L.C.com"
"google_map_api" => ""
"is_pos_purchased" => "0"
"admin_version" => "4.0.17"
"app_version" => "4.0.17"
"web_version" => "4.0.17"
"pos_version" => "0"
"android_app_link" => "#"
"iphone_app_link" => "#"
"about_content" => "#"
"contact_content" => "Established in 1988, our family business has built strong networks with partners globally and locally. With branches in Canada and Sri Lanka"
"contents" => null
"fb_redirect_url" => "http://YOUR_DOMAIN_NAME/login/facebook/callback"
"google_client_id" => "GOOGLE_CLIENT_ID"
"google_client_secret" => "GOOGLE_SECRET_KEY"
"google_redirect_url" => "http://YOUR_DOMAIN_NAME/login/google/callback"
"newsletter" => "0"
"allow_cookies" => "0"
"card_style" => "1"
"banner_style" => "1"
"mail_chimp_api" => ""
"mail_chimp_list_id" => ""
"newsletter_image" => "images/media/2019/10/newsletter.jpg"
"instauserid" => ""
"web_card_style" => "1"
"file" => null
]
"homeBanners" => Illuminate\Support\Collection {#1124}
"pages" => Illuminate\Support\Collection {#1099}
"categories" => array:3 [
0 => {#1380}
1 => {#1091}
2 => {#1396}
]
"allcategories" => Illuminate\Support\Collection {#1400}
"manufacturers" => Illuminate\Support\Collection {#1233}
"total_wishlist" => 0
"homepagebanners" => Illuminate\Support\Collection {#1156}
"commercialBanners" => Illuminate\Support\Collection {#1383}
"serviceBanners" => Illuminate\Support\Collection {#1353}
"echosmartBanners" => Illuminate\Support\Collection {#1251}
"shippingBanners" => Illuminate\Support\Collection {#1167}
"driedfishBanners" => Illuminate\Support\Collection {#1379}
]
]
"final_theme" => array:16 [
"top_offer" => """
<div class="alert alert-warning alert-dismissible fade show" role="alert">\n
<div class="container">\n
<div class="pro-description">\n
<div class="pro-info">\n
Get<strong> UPTO 40% OFF </strong>on your 1st order\r\n
<div class="pro-link-dropdown js-toppanel-link-dropdown">\r\n
<a href="/shop" class="pro-dropdown-toggle">\r\n
SHOP NOW\r\n
</a>\r\n
</div> </div>\n
<button type="button" class="close" data-dismiss="alert" aria-label="Close">\n
<span aria-hidden="true">×</span>\n
</button>\n
</div>\n
\n
</div>\n
</div>\n
"""
"header" => """
<header class="header-main" id="inner-header">\n
<div class="nav-area-full">\n
<div class="container">\n
<div class="row">\n
<div class="col-lg-3 logo-area">\n
<div class="logo"><a href="https://emxmotors.com"> <img class="img-fluid" src="https://emxmotors.com/images/media/2022/01/T2Fqj03409.png" alt="*" /> <!-- <span>a</span>l <span>a</span>zhar <strong>motors</strong> --></a></div>\n
</div>\n
<div class="col-lg-9 d-flex">\n
<div class="main-menu align-self-center d-none d-lg-block">\n
<ul>\n
<li class="nav-item dropdown AboutUs-menu"><a href="/about" >About Us</a></li><li class="nav-item dropdown MXkids-menu"><a href="javascript:" >MX kids</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:">\n
Torrot Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/1">\n
SUPERMOTARD ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/11">\n
SUPERMOTARD TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/3">\n
MOTOCROSS ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/2">\n
MOTOCROSS TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/5">\n
TRIAL ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/4">\n
TRIAL TWO\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/torrot">Show More</a></li></ul></li><li class="nav-item dropdown MXBikes-menu"><a href="#" >MX Bikes</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Drillone Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">\n
Drillone Enduro\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Talaria Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">\n
Talaria Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
BHR Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/bhr_bikes">\n
BHR Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/bhr_bikes">Show More</a></li></ul></li><li class="nav-item dropdown E-Bikes-menu"><a href="https://emxmotors.com/#our-collection-sec" >E-Bikes</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Urbet Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=69">\n
Urbet Nura\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=70">\n
Urbet Gadiro\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=71">\n
Urbet Ego\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=72">\n
Urbet Riazor\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=urbet-bikes">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Delfast Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">\n
Delfast Top 3.0\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Silverback\n
</a>\n
<a class="show-more-btn" href="javascript:">Coming Soon</a></li></ul></li><li class="nav-item dropdown E-scooters-menu"><a href="javascript:;" >E-scooters</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Fidico E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">\n
Black Knight ( 11-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">\n
Black Knight ( 11-45Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">\n
Black Knight ( 11P-40Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">\n
Black Knight ( 11P-60Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">\n
Light Speed ( 13-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">\n
Light Speed (13-60AH)\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=fidico-escooters">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Nami E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=95">\n
Nami Burn E\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=96">\n
Burn E-2 Max\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=nami">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Numo E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">\n
Slack\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">Show More</a></li></ul></li><li class="nav-item dropdown Products-menu"><a href="https://emxmotors.com/products" >Products</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=helmets">\n
Helmets\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/sb-34-zorro-white">\n
SB-34 zorro white\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/blade-helmet">\n
blade helmet\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=helmets">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=accessories">\n
Accessories\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/gloves">\n
gloves\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/shoes">\n
Shoes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=accessories">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=mod-shop">\n
Mod Shop\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/ebmx">\n
EBMX\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
KO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Kaniwaba\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=mod-shop">Show More</a></li></ul></li><li class="nav-item dropdown Services-menu"><a href="javascript:;" >Services</a><ul class="sub-menu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-repairing-services">\n
e-bike repairing services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-and-e-motor-services">\n
e-bike and e-motor services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-services">\n
custom e-bike services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=ride-testing-experience">\n
ride testing experience\n
</a>\n
</ul></li><li class="nav-item dropdown Blogs-menu"><a href="http://emxmotors.com/blogs" >Blogs</a></li><li class="nav-item dropdown Contact-menu"><a href="/contact" >Contact</a></li>\n
<!-- <li><a href="javascript:;">Home</a></li>\n
<li><a href="javascript:;">Bikes</a></li>\n
<li><a href="javascript:;">Products</a></li>\n
<li><a href="javascript:;">Blogs</a></li> -->\n
<li id="top-search"><a href="javascript:;" id="showBtn">\n
<ul id="list-dots">\n
<li></li>\n
<li></li>\n
<li></li>\n
<li></li>\n
<li></li>\n
<li></li>\n
<li></li>\n
<li></li>\n
<li></li>\n
</ul>\n
</a></li>\n
<li id="top-icon"><a href="javascript:;" onclick="openSearch()"><span></span></a></li>\n
</ul>\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
</header>
"""
"mobile_header" => """
<header id="headerMobile" class="header-area header-mobile d-lg-none d-xl-none">\n
<div class="header-mini bg-top-bar">\n
<div class="container">\n
<div class="row align-items-center">\n
<div class="col-12">\n
\n
<nav id="navbar_0" class="navbar navbar-expand-md navbar-dark navbar-0">\n
<div class="navbar-lang">\n
\n
\n
<div class="select-control currency" >\n
<select class="form-control " onchange="myFunction2(this.options[this.selectedIndex].value)">\n
<option selected value="1">\n
\n
USD\n
($)</span>\n
\n
</option>\n
<option value="9">\n
\n
AED\n
(د.إ)\n
\n
</option>\n
</select> \n
</div>\n
<!-- END Currency LANGUAGE CODE SECTION --> \n
</nav>\n
</div>\n
</div>\n
</div>\n
</div>\n
<div class="header-maxi bg-header-bar ">\n
<div class="container">\n
\n
<div class="row align-items-center">\n
<div class="col-2 pr-0">\n
<div class="navigation-mobile-container">\n
<a href="javascript:void(0)" class="navigation-mobile-toggler">\n
<span class="fas fa-bars"></span>\n
</a>\n
<nav id="navigation-mobile">\n
<div class="logout-main">\n
<div class="welcome">\n
<span> </span>\n
</div>\n
</div>\n
\n
<li class="nav-item dropdown "><a class="nav-link " href="https://emxmotors.com//about" >About Us</a></li><li class="nav-item dropdown "><a class="nav-link dropdown-toggle" href="javascript:" >MX kids</a><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:">\n
Torrot Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/1">\n
SUPERMOTARD ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/11">\n
SUPERMOTARD TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/3">\n
MOTOCROSS ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/2">\n
MOTOCROSS TWO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/5">\n
TRIAL ONE\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/torrot_detail/4">\n
TRIAL TWO\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/torrot">Show More</a></li></div></li><li class="nav-item dropdown "><a class="nav-link dropdown-toggle" href="https://emxmotors.com/#" >MX Bikes</a><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Drillone Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">\n
Drillone Enduro\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Talaria Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">\n
Talaria Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
BHR Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/bhr_bikes">\n
BHR Bikes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/bhr_bikes">Show More</a></li></div></li><li class="nav-item dropdown "><a href="javascript:">E-Bikes</a><ul class="sub-menu"><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=black-knight">Black Knight</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">BlackKnight BK11P-60Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">BlackKnight BK11P-40Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">BlackKnight BK11-45Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">BlackKnight BK11-40AH</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">delfast bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">DELFAST Top 3.0</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">drillone bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=73">Drillone Enduro</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=fidico-escooters">Fidico E-scooters</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=87">Lightspeed Knight</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=86">Black Knight</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">Lightspeed LK13-60AH</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">Lightspeed LK13-40AH</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">BlackKnight BK11P-60Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">BlackKnight BK11P-40Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">BlackKnight BK11-45Ah</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">BlackKnight BK11-40AH</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=lightspeed">Lightspeed</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">Lightspeed LK13-60AH</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">Lightspeed LK13-40AH</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=nami">Nami</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=96">Nami Burn E-2 Max</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=95">Nami Burn E</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=numo">Numo</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">NUMO Core 920R</a></li></ul></li><li class="nav-item dropdown"><a href="javascript:">Silverback Bikes</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=talaria">Talaria Bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=85">Talaria Bikes</a></li></ul></li><li class="nav-item dropdown"><a href="javascript:">TORROT BIKES</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/category-detail?slidercategory=urbet-bikes">urbet bikes</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=69">urbet nura</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=72">urbet riazor</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=71">urbet ego</a></li><li class="nav-item dropdown"><a href="https://emxmotors.com/sliderproduct-detail?sliderproduct=70">urbet gadiro</a></li></ul></li></ul></li><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Urbet Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=69">\n
Urbet Nura\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=70">\n
Urbet Gadiro\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=71">\n
Urbet Ego\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=72">\n
Urbet Riazor\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=urbet-bikes">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Delfast Bikes\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">\n
Delfast Top 3.0\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=74">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Silverback\n
</a>\n
<a class="show-more-btn" href="javascript:">Coming Soon</a></li></div></li><li class="nav-item dropdown "><a class="nav-link dropdown-toggle" href="https://emxmotors.com/javascript:;" >E-scooters</a><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Fidico E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=89">\n
Black Knight ( 11-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=90">\n
Black Knight ( 11-45Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=91">\n
Black Knight ( 11P-40Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=92">\n
Black Knight ( 11P-60Ah )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=93">\n
Light Speed ( 13-40AH )\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=94">\n
Light Speed (13-60AH)\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=fidico-escooters">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Nami E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=95">\n
Nami Burn E\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=96">\n
Burn E-2 Max\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/category-detail?slidercategory=nami">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Numo E-scooters\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">\n
Slack\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/sliderproduct-detail?sliderproduct=97">Show More</a></li></div></li><li class="nav-item dropdown"><a href="javascript:">Products</a><ul class="sub-menu"><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=helmets" >Helmets</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/blade-helmet">Blade Helmet</a></li><li class="nav-item dropdown"><a href="product-detail/sb-34-zorro-white">SB-34 ZORRO WHITE</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=accessories" >Accessories</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/gloves">Gloves</a></li><li class="nav-item dropdown"><a href="product-detail/shoes">Shoes</a></li></ul></li></ul><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=helmets">\n
Helmets\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/sb-34-zorro-white">\n
SB-34 zorro white\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/blade-helmet">\n
blade helmet\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=helmets">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=accessories">\n
Accessories\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/gloves">\n
gloves\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/product-detail/shoes">\n
Shoes\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=accessories">Show More</a></li>\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/shop?category=mod-shop">\n
Mod Shop\n
</a>\n
\n
<ul class="sub-menu-child">\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" target="_blank" href="https://emxmotors.com/ebmx">\n
EBMX\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
KO\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="javascript:;">\n
Kaniwaba\n
</a>\n
</ul><a class="show-more-btn" href="https://emxmotors.com/shop?category=mod-shop">Show More</a></li></div></li><li class="nav-item dropdown"><a href="javascript:">Services</a><ul class="sub-menu"><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=helmets" >Helmets</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/blade-helmet">Blade Helmet</a></li><li class="nav-item dropdown"><a href="product-detail/sb-34-zorro-white">SB-34 ZORRO WHITE</a></li></ul></li><li class="nav-item dropdown"><a href="https://emxmotors.com/shop?category=accessories" >Accessories</a><ul class="sub-menu-child"><li class="nav-item dropdown"><a href="product-detail/gloves">Gloves</a></li><li class="nav-item dropdown"><a href="product-detail/shoes">Shoes</a></li></ul></li></ul><div class="dropdown-menu deskMenu" >\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-repairing-services">\n
e-bike repairing services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-and-e-motor-services">\n
e-bike and e-motor services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=e-bike-services">\n
custom e-bike services\n
</a>\n
\n
<li class="nav-item dropdown"><a class="dropdown-item ascasc" href="https://emxmotors.com/customwork?page_name=ride-testing-experience">\n
ride testing experience\n
</a>\n
</div></li><li class="nav-item dropdown "><a class="nav-link " href="https://emxmotors.com/http://emxmotors.com/blogs" >Blogs</a></li><li class="nav-item dropdown "><a class="nav-link " href="https://emxmotors.com//contact" >Contact</a></li>\n
\n
<div class="nav-link">Welcome!</div>\n
<a href="https://emxmotors.com/login" class="main-manu btn btn-primary"><i class="fa fa-lock" aria-hidden="true"></i> Login/Register</a>\n
</nav>\n
</div>\n
\n
</div>\n
\n
\n
\n
<div class="col-8">\n
<a href="https://emxmotors.com" class="logo">\n
\n
<img class="img-fluid" src="https://emxmotors.com/images/media/2022/01/T2Fqj03409.png" alt="EMX Motors">\n
</a>\n
</div>\n
\n
<div class="col-2 pl-0"> \n
<ul class="pro-header-right-options" id="resposive-header-cart">\n
<li class="dropdown">\n
\n
\n
<button class="btn dropdown-toggle" type="button" id="headerOneCartButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> \n
<div class="cart-left">\n
<i class="fas fa-shopping-bag"></i>\n
<span class="badge badge-secondary">0</span>\n
</div>\n
\n
</button> \n
\n
\n
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="headerOneCartButton">\n
<ul class="shopping-cart-items">\n
<li>You have no items in your shopping cart.</li>\n
</ul>\n
</div>\n
\n
\n
\n
\n
\n
<!--\n
<script src="https://code.jquery.com/jquery-1.9.1.js"></script>\n
<script src="https://code.jquery.com/ui/1.11.0/jquery-ui.js"></script>\n
-->\n
</ul> \n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
<div class="header-navbar bg-menu-bar">\n
<div class="container">\n
<form class="form-inline" action="https://emxmotors.com/shop" method="get">\n
<div class="search">\n
<div class="select-control">\n
<select class="form-control" name="category">\n
<option value="">Categories</option><option value="helmets" >Helmets</option><option value="accessories" >Accessories</option><option value="mod-shop" >Mod Shop</option><option value="ebmx" >-EBMX</option><option value="ko" >-KO</option><option value="kaniwaba" >-Kaniwaba</option> </select>\n
</div>\n
<input type="search" name="search" placeholder="Search Products..." value="">\n
<button class="btn btn-secondary" type="submit">\n
<i class="fa fa-search"></i></button>\n
</div>\n
</form>\n
</div>\n
</div>\n
</header>\n
"""
"carousel" => """
<!-- Bootstrap Carousel Content Full Screen -->\n
\n
<section class="carousel-content">\n
<div class="container-fuild">\n
<div id="carouselExampleIndicators1" class="carousel slide" data-ride="carousel">\n
<ol class="carousel-indicators">\n
\n
\n
</ol>\n
<div class="carousel-inner">\n
\n
</div>\n
\n
<a class="carousel-control-prev" href="#carouselExampleIndicators1" role="button" data-slide="prev">\n
<span class="sr-only"></span>\n
</a>\n
<a class="carousel-control-next" href="#carouselExampleIndicators1" role="button" data-slide="next">\n
<span class="sr-only"></span>\n
</a>\n
</div>\n
</div>\n
</section>\n
"""
"banner" => """
<!-- //banner three -->\n
<div class="banner-three">\n
\n
<div class="container">\n
<div class="group-banners">\n
<div class="row">\n
<div class="col-12 col-md-4">\n
<figure class="banner-image ">\n
<a href="/shop"><img class="img-fluid" src="https://emxmotors.com/images/media/2019/09/4iGAB10408.jpg" alt="Banner Image"></a>\n
</figure>\n
</div>\n
<div class="col-12 col-md-8">\n
\n
<div class="row">\n
<div class="col-12 col-md-6">\n
<figure class="banner-image ">\n
<a href="/shop"><img class="img-fluid" src="https://emxmotors.com/images/media/2019/09/MImPw10908.jpg" alt="Banner Image"></a>\n
</figure>\n
</div>\n
<div class="col-12 col-md-6">\n
\n
<figure class="banner-image ">\n
<a href="/shop"><img class="img-fluid" src="https://emxmotors.com/images/media/2019/09/X2FFc10408.jpg" alt="Banner Image"></a>\n
</figure>\n
</div>\n
</div>\n
<figure class="banner-image " style="margin-top: 30px;">\n
<a href="/shop"><img class="img-fluid" src="https://emxmotors.com/images/media/2019/09/pc7OR10108.jpg" alt="Banner Image"></a>\n
</figure>\n
</div>\n
\n
\n
</div>\n
</div>\n
</div>\n
\n
</div> \n
"""
"footer" => """
<!--Footer Section Start -->\n
<footer class="footer">\n
<div class="container">\n
<div class="row">\n
<div class="col-lg-3 wow fadeInLeft" data-wow-duration="1s" data-wow-delay="0.3s">\n
<div class="footer-one">\n
<ul>\n
<li><a href="tel:(04) 345 0700">(04) 345 0700</a></li>\n
\n
<li><a href="tel:+971 56 555 2200">+971 56 555 2200</a></li>\n
<li><a href="mailto:emx.motorsme@gmail.com">emx.motorsme@gmail.com</a></li>\n
<li class="locIconn"><a target="_blank" href="https://maps.google.com/maps?q=25.12298011779785%2C55.20968246459961&z=17&hl=en">\n
EMX MOTORS LLC Al Quoz Industrial Area 3 Plot: 253-0 Makani: 19533-79750 Warehouse #1 Dubai - United Arab Emirates\n
</a></li>\n
<li class="locIconn"><a target="_blank" href="https://www.google.com/maps/place/Al+Quoz+-+Al+Quoz+4+-+Dubai+-+United+Arab+Emirates/@25.1526941,55.2424443,15z/data=!3m1!4b1!4m5!3m4!1s0x3e5f69984282d957:0xb3f17e05e0d607ae!8m2!3d25.1514047!4d55.250782">\n
USA - 100 N Central Expressway 613, Richardson, TX 75080 . \n
</a></li>\n
\n
\n
</ul>\n
</div>\n
</div>\n
<div class="col-lg-4 offset-lg-1 wow fadeInUp" data-wow-duration="1s" data-wow-delay="0.3s">\n
<div class="footer-two">\n
<div class="fotoer-logo">\n
<img src="https://emxmotors.com/images/al-azhar-logo-footer.png" class="img-fluid">\n
</div>\n
<ul class="footer-menu-links">\n
<li><a href="https://emxmotors.com">Home</a></li>\n
<li><a href="https://emxmotors.com/about">About Us</a></li>\n
<li><a href="https://emxmotors.com/#our-collection-sec">Bikes</a></li>\n
<!-- <li><a href="https://emxmotors.com/products">Products</a></li> -->\n
<li><a href="https://emxmotors.com/news">Blogs</a></li>\n
<li><a href="https://emxmotors.com/contact">Contact</a></li>\n
</ul>\n
<div class="newsletter-box">\n
<h6>Get the freshest Offers and News</h6>\n
<form action="">\n
<input type="text" placeholder="Your email here">\n
<div class="ct-btn">\n
<input type="submit" value="Subscribe">\n
</div>\n
</form>\n
</div>\n
\n
\n
<div class="follow-us-box">\n
<h5>Follow Us</h5>\n
<ul>\n
<li><a href="https://www.facebook.com/emxmotorsuae/" target="blank"><i class="fa fa-facebook"></i></a></li>\n
<li><a href="https://www.instagram.com/emxmotorsme/" target="blank"><i class="fa fa-instagram"></i></a></li>\n
<!-- <li><a href="https://www.twitter.com" target="blank"><i class="fa fa-twitter"></i></a></li> -->\n
<li><a href="https://www.youtube.com/channel/UC92lCaRzfimi_Hrw3MQo7TQ" target="blank"><i class="fa fa-youtube-play"></i></a></li>\n
</ul>\n
</div>\n
</div>\n
</div>\n
<div class="col-lg-3 offset-lg-1 wow fadeInRight">\n
<div class="rss-feed-box">\n
<script src="https://apps.elfsight.com/p/platform.js" defer></script>\n
<div class="elfsight-app-91a789a2-e7fb-42bf-a07a-0e5b6595b145"></div>\n
\n
</div>\n
</div>\n
\n
<div class="disclaimer">\n
<div class="row">\n
<div class="col-lg-3">\n
<!-- <div class="col-lg-3 wow bounceInUp" data-wow-duration="2s" data-wow-delay="0.3s"> -->\n
<ul class="disclaimer-links">\n
<li><a href="https://emxmotors.com/page?name=privacy-policy">Privacy Policy</a></li>\n
<li><a href="https://emxmotors.com/page?name=term-services">Terms Of Services</a></li>\n
</ul>\n
</div>\n
<div class="col-lg-6">\n
<p>© <span id="year"></span> EMX Motors L.L.C, ALL RIGHTS RESERVED</p>\n
</div>\n
<div class="col-lg-3">\n
<h6>Designed and Developed By : \n
<!-- <a href="https://www.digitalsetgo.com/" target="blank">DigitalsetGo</a> -->\n
DigitalsetGo\n
</h6>\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
</footer>\n
<!-- Footer Section End -->\n
\n
\n
\n
\n
</main>\n
<script src="https://emxmotors.com/assets/js/jquery.min.js"></script> \n
<!-- <script type="text/javascript" src="https://emxmotors.com/assets/js/bootstrap.min.js"></script> -->\n
\n
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous" data-pagespeed-no-defer></script>\n
<script type="text/javascript" src="https://emxmotors.com/assets/js/jquery.fancybox.min.js" data-pagespeed-no-defer></script> \n
<script type="text/javascript" src="https://emxmotors.com/assets/js/wow.js" data-pagespeed-no-defer></script> \n
<script type="text/javascript" src="https://emxmotors.com/assets/js/functions.js" data-pagespeed-no-defer></script> \n
<script type="text/javascript" src="https://emxmotors.com/assets/js/slick.js" data-pagespeed-no-defer></script> \n
<script>\n
$(document).ready(function(){\n
$('#hideBtn').click(function(){\n
$('#box').fadeOut('slow');\n
});\n
$('#showBtn').click(function(){\n
$('#box').fadeIn('slow');\n
});\n
\n
$('#three-btn').click(function(){\n
$('#three-btn-div').toggle();\n
});\n
\n
$('.devTab ul li:first-child a').addClass('active');\n
$('.tabArea .tabPnl:first-child').fadeIn();\n
$('.devTab li a').click(function () {\n
var datSrc = $(this).data('tab');\n
$('.devTab li a').removeClass('active');\n
$(this).addClass('active');\n
$('.tabArea .tabPnl').hide();\n
$('.tabArea .tabPnl'+datSrc).fadeIn();\n
}); \n
\n
\n
\n
});\n
\n
\n
function openSearch() {\n
document.getElementById("myOverlay").style.display = "block";\n
}\n
\n
function closeSearch() {\n
document.getElementById("myOverlay").style.display = "none";\n
}\n
\n
\n
//load more products\n
jQuery(document).on('click', '#load_products', function(e){\n
jQuery('#loader').css('display','flex');\n
var page_number = jQuery('#page_number').val();\n
var total_record = jQuery('#total_record').val();\n
var products_style = jQuery('#products_style').val();\n
var pagelayout = jQuery('#pagelayout').val();\n
\n
var formData = jQuery("#load_products_form").serialize();\n
jQuery.ajax({\n
headers: {'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content')},\n
url: 'https://emxmotors.com/filterProducts',\n
type: "POST",\n
data: formData,\n
success: function (res) {\n
if(jQuery.trim().res==0){\n
// jQuery('#load_products').hide();\n
// jQuery('#loaded_content').show();\n
}else{\n
page_number++;\n
jQuery('#page_number').val(page_number);\n
jQuery('.swap .row').html(res);\n
// jQuery('.swap .row').html(res);\n
jQuery('.swap2 .row').html(res);\n
var record_limit = jQuery('#filter_total_record').val();\n
\n
var showing_record = record_limit;\n
if(total_record<=showing_record){\n
\n
jQuery('.showing_record').html(total_record);\n
jQuery('#load_products').hide();\n
jQuery('#loaded_content').show();\n
}else{\n
jQuery('.showing_record').html(showing_record);\n
}\n
}\n
\n
\n
if(pagelayout !== undefined){\n
if(products_style == 'list'){\n
jQuery( '#swap2 .col-12' ).removeClass( 'griding' );\n
jQuery( '#swap2 .col-12' ).removeClass( 'col-md-6' );\n
jQuery( '#swap2 .col-12' ).removeClass( 'col-lg-3' );\n
jQuery( '#swap2 .col-12' ).addClass( 'listing' );\n
\n
}else{\n
jQuery( '#swap2 .col-12' ).addClass( 'griding' );\n
jQuery( '#swap2 .col-12' ).addClass( 'col-md-6' );\n
jQuery( '#swap2 .col-12' ).addClass( 'col-lg-3' );\n
jQuery( '#swap2 .col-12' ).removeClass( 'listing' );\n
}\n
}else{\n
if(products_style == 'list'){\n
jQuery( '#swap .col-12' ).removeClass( 'griding' );\n
jQuery( '#swap .col-12' ).removeClass( 'col-lg-4' );\n
jQuery( '#swap .col-12' ).removeClass( 'col-sm-6' );\n
jQuery( '#swap .col-12' ).addClass( 'listing' );\n
\n
}else{\n
jQuery( '#swap .col-12' ).removeClass( 'listing' );\n
jQuery( '#swap .col-12' ).addClass( 'col-lg-4' );\n
jQuery( '#swap .col-12' ).addClass( 'col-sm-6' ); \n
jQuery( '#swap .col-12' ).addClass( 'griding' );\n
}\n
}\n
\n
\n
\n
jQuery('#loader').hide();\n
},\n
});\n
});\n
\n
</script>\n
\n
<!-- <script src='https://unpkg.com/spritespin@x.x.x/release/spritespin.js' type='text/javascript'></script> -->\n
\n
\n
<script type="text/javascript">\n
(function (global, factory) {\n
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n
typeof define === 'function' && define.amd ? define(['exports'], factory) :\n
(factory((global.SpriteSpin = {})));\n
}(this, (function (exports) { 'use strict';\n
\n
/**\n
* @internal\n
*/\n
var Api = /** @class */ (function () {\n
function Api(data) {\n
this.data = data;\n
}\n
return Api;\n
}());\n
/**\n
* Adds methods to the SpriteSpin api\n
*\n
* @public\n
*/\n
function extendApi(methods) {\n
var api = Api.prototype;\n
for (var key in methods) {\n
if (methods.hasOwnProperty(key)) {\n
if (api[key]) {\n
throw new Error('API method is already defined: ' + key);\n
}\n
else {\n
api[key] = methods[key];\n
}\n
}\n
}\n
return api;\n
}\n
\n
var $$1 = window.jQuery || window.$;\n
\n
function getCursorPosition(event) {\n
var touches = event.touches;\n
var source = event;\n
// jQuery Event normalization does not preserve the 'event.touches'\n
// try to grab touches from the original event\n
if (event.touches === undefined && event.originalEvent !== undefined) {\n
touches = event.originalEvent.touches;\n
}\n
// get current touch or mouse position\n
if (touches !== undefined && touches.length > 0) {\n
source = touches[0];\n
}\n
return {\n
x: source.clientX || 0,\n
y: source.clientY || 0\n
};\n
}\n
\n
var canvas;\n
var context;\n
function detectionContext() {\n
if (context) {\n
return context;\n
}\n
if (!canvas) {\n
canvas = document.createElement('canvas');\n
}\n
if (!canvas || !canvas.getContext) {\n
return null;\n
}\n
context = canvas.getContext('2d');\n
return context;\n
}\n
/**\n
* Idea taken from https://github.com/stomita/ios-imagefile-megapixel\n
* Detects whether the image has been sub sampled by the browser and does not have its original dimensions.\n
* This method unfortunately does not work for images that have transparent background.\n
*/\n
function detectSubsampling(img, width, height) {\n
if (!detectionContext()) {\n
return false;\n
}\n
// sub sampling happens on images above 1 megapixel\n
if (width * height <= 1024 * 1024) {\n
return false;\n
}\n
// set canvas to 1x1 pixel size and fill it with magenta color\n
canvas.width = canvas.height = 1;\n
context.fillStyle = '#FF00FF';\n
context.fillRect(0, 0, 1, 1);\n
// render the image with a negative offset to the left so that it would\n
// fill the canvas pixel with the top right pixel of the image.\n
context.drawImage(img, -width + 1, 0);\n
// check color value to confirm image is covering edge pixel or not.\n
// if color still magenta, the image is assumed to be sub sampled.\n
try {\n
var dat = context.getImageData(0, 0, 1, 1).data;\n
return (dat[0] === 255) && (dat[1] === 0) && (dat[2] === 255);\n
}\n
catch (err) {\n
// avoids cross origin exception for chrome when code runs without a server\n
return false;\n
}\n
}\n
\n
/**\n
*\n
*/\n
function getOuterSize(data) {\n
var width = Math.floor(data.width || data.frameWidth || data.target.innerWidth());\n
var height = Math.floor(data.height || data.frameHeight || data.target.innerHeight());\n
return {\n
aspect: width / height,\n
height: height,\n
width: width\n
};\n
}\n
function getComputedSize(data) {\n
var size = getOuterSize(data);\n
if (typeof window.getComputedStyle !== 'function') {\n
return size;\n
}\n
var style = window.getComputedStyle(data.target[0]);\n
if (!style.width) {\n
return size;\n
}\n
size.width = Math.floor(Number(style.width.replace('px', '')));\n
size.height = Math.floor(size.width / size.aspect);\n
return size;\n
}\n
/**\n
*\n
*/\n
function getInnerSize(data) {\n
var width = Math.floor(data.frameWidth || data.width || data.target.innerWidth());\n
var height = Math.floor(data.frameHeight || data.height || data.target.innerHeight());\n
return {\n
aspect: width / height,\n
height: height,\n
width: width\n
};\n
}\n
/**\n
*\n
*/\n
function getInnerLayout(mode, inner, outer) {\n
// get mode\n
var isFit = mode === 'fit';\n
var isFill = mode === 'fill';\n
var isMatch = mode === 'stretch';\n
// resulting layout\n
var layout = {\n
width: '100%',\n
height: '100%',\n
top: 0,\n
left: 0,\n
bottom: 0,\n
right: 0,\n
position: 'absolute',\n
overflow: 'hidden'\n
};\n
// no calculation here\n
if (!mode || isMatch) {\n
return layout;\n
}\n
// get size and aspect\n
var aspectIsGreater = inner.aspect >= outer.aspect;\n
// mode == original\n
var width = inner.width;\n
var height = inner.height;\n
// keep aspect ratio but fit/fill into container\n
if (isFit && aspectIsGreater || isFill && !aspectIsGreater) {\n
width = outer.width;\n
height = outer.width / inner.aspect;\n
}\n
if (isFill && aspectIsGreater || isFit && !aspectIsGreater) {\n
height = outer.height;\n
width = outer.height * inner.aspect;\n
}\n
// floor the numbers\n
width = Math.floor(width);\n
height = Math.floor(height);\n
// position in center\n
layout.width = width;\n
layout.height = height;\n
layout.top = Math.floor((outer.height - height) / 2);\n
layout.left = Math.floor((outer.width - width) / 2);\n
layout.right = layout.left;\n
layout.bottom = layout.top;\n
return layout;\n
}\n
\n
var img;\n
/**\n
* gets the original width and height of an image element\n
*/\n
function naturalSize(image) {\n
// for browsers that support naturalWidth and naturalHeight properties\n
if (image.naturalWidth) {\n
return {\n
height: image.naturalHeight,\n
width: image.naturalWidth\n
};\n
}\n
// browsers that do not support naturalWidth and naturalHeight properties have to fall back to the width and\n
// height properties. However, the image might have a css style applied so width and height would return the\n
// css size. To avoid that create a new Image object that is free of css rules and grab width and height\n
// properties\n
//\n
// assume that the src has already been downloaded, so no onload callback is needed.\n
img = img || new Image();\n
img.crossOrigin = image.crossOrigin;\n
img.src = image.src;\n
return {\n
height: img.height,\n
width: img.width\n
};\n
}\n
\n
/**\n
* Measures the image frames that are used in the given data object\n
*/\n
function measure(images, options) {\n
if (images.length === 1) {\n
return [measureSheet(images[0], options)];\n
}\n
else if (options.framesX && options.framesY) {\n
return measureMutipleSheets(images, options);\n
}\n
else {\n
return measureFrames(images, options);\n
}\n
}\n
function measureSheet(image, options) {\n
var result = { id: 0, sprites: [] };\n
measureImage(image, options, result);\n
var frames = options.frames;\n
var framesX = Number(options.framesX) || frames;\n
var framesY = Math.ceil(frames / framesX);\n
var frameWidth = Math.floor(result.width / framesX);\n
var frameHeight = Math.floor(result.height / framesY);\n
var divisor = result.isSubsampled ? 2 : 1;\n
for (var i = 0; i < frames; i++) {\n
var x = (i % framesX) * frameWidth;\n
var y = Math.floor(i / framesX) * frameHeight;\n
result.sprites.push({\n
id: i,\n
x: x, y: y,\n
width: frameWidth,\n
height: frameHeight,\n
sampledX: x / divisor,\n
sampledY: y / divisor,\n
sampledWidth: frameWidth / divisor,\n
sampledHeight: frameHeight / divisor\n
});\n
}\n
return result;\n
}\n
function measureFrames(images, options) {\n
var result = [];\n
for (var id = 0; id < images.length; id++) {\n
// TODO: optimize\n
// don't measure images with same size twice\n
var sheet = measureSheet(images[id], { frames: 1, framesX: 1, detectSubsampling: options.detectSubsampling });\n
sheet.id = id;\n
result.push(sheet);\n
}\n
return result;\n
}\n
function measureMutipleSheets(images, options) {\n
var result = [];\n
for (var id = 0; id < images.length; id++) {\n
// TODO: optimize\n
// don't measure images with same size twice\n
var sheet = measureSheet(images[id], {\n
frames: undefined,\n
framesX: options.framesX,\n
framesY: options.framesY,\n
detectSubsampling: options.detectSubsampling\n
});\n
sheet.id = id;\n
result.push(sheet);\n
}\n
return result;\n
}\n
function measureImage(image, options, result) {\n
var size = naturalSize(image);\n
result.isSubsampled = options.detectSubsampling && detectSubsampling(image, size.width, size.height);\n
result.width = size.width;\n
result.height = size.height;\n
result.sampledWidth = size.width / (result.isSubsampled ? 2 : 1);\n
result.sampledHeight = size.height / (result.isSubsampled ? 2 : 1);\n
return result;\n
}\n
function findSpecs(metrics, frames, frame, lane) {\n
var spriteId = lane * frames + frame;\n
var sheetId = 0;\n
var sprite = null;\n
var sheet = null;\n
while (true) {\n
sheet = metrics[sheetId];\n
if (!sheet) {\n
break;\n
}\n
if (spriteId >= sheet.sprites.length) {\n
spriteId -= sheet.sprites.length;\n
sheetId++;\n
continue;\n
}\n
sprite = sheet.sprites[spriteId];\n
break;\n
}\n
return { sprite: sprite, sheet: sheet };\n
}\n
\n
function indexOf(element, arr) {\n
for (var i = 0; i < arr.length; i++) {\n
if (arr[i] === element) {\n
return i;\n
}\n
}\n
}\n
function noop() {\n
//\n
}\n
function preload(opts) {\n
var src;\n
var input = opts.source;\n
src = typeof input === 'string' ? [input] : input;\n
// const src: string[] = ? [opts.source] : opts.source\n
var images = [];\n
var targetCount = (opts.preloadCount || src.length);\n
var onInitiated = opts.initiated || noop;\n
var onProgress = opts.progress || noop;\n
var onComplete = opts.complete || noop;\n
var count = 0;\n
var completed = false;\n
var firstLoaded = false;\n
var tick = function () {\n
count += 1;\n
onProgress({\n
index: indexOf(this, images),\n
loaded: count,\n
total: src.length,\n
percent: Math.round((count / src.length) * 100)\n
});\n
firstLoaded = firstLoaded || (this === images[0]);\n
if (firstLoaded && !completed && (count >= targetCount)) {\n
completed = true;\n
onComplete(images);\n
}\n
};\n
for (var _i = 0, src_1 = src; _i < src_1.length; _i++) {\n
var url = src_1[_i];\n
var img = new Image();\n
// push result\n
images.push(img);\n
// https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image\n
img.crossOrigin = opts.crossOrigin;\n
// bind logic, don't care about abort/errors\n
img.onload = img.onabort = img.onerror = tick;\n
// begin load\n
img.src = url;\n
}\n
onInitiated(images);\n
}\n
\n
function padNumber(num, length, pad) {\n
var result = String(num);\n
while (result.length < length) {\n
result = String(pad) + result;\n
}\n
return result;\n
}\n
/**\n
* Generates an array of source strings\n
*\n
* @remarks\n
* Takes a template string and generates an array of strings by interpolating {lane} and {frame} placeholders.\n
*\n
* ```\n
* sourceArray('http://example.com/image_{frame}.jpg, { frame: [1, 3], digits: 2 })\n
* // gives:\n
* // [ 'http://example.com/image_01.jpg', 'http://example.com/image_02.jpg', 'http://example.com/image_03.jpg' ]\n
*\n
* sourceArray('http://example.com/image_FRAME.jpg, { frame: [1, 3], digits: 2, framePlacer: 'FRAME' })\n
* // gives:\n
* // [ 'http://example.com/image_01.jpg', 'http://example.com/image_02.jpg', 'http://example.com/image_03.jpg' ]\n
* ```\n
*\n
* @param template - The template string\n
* @param opts - Interpolation options\n
*\n
* @public\n
*/\n
function sourceArray(template, opts) {\n
var digits = opts.digits || 2;\n
var lPlacer = opts.lanePlacer || '{lane}';\n
var fPlacer = opts.framePlacer || '{frame}';\n
var fStart = 0;\n
var fEnd = 0;\n
if (opts.frame) {\n
fStart = opts.frame[0];\n
fEnd = opts.frame[1];\n
}\n
var lStart = 0;\n
var lEnd = 0;\n
if (opts.lane) {\n
lStart = opts.lane[0];\n
lEnd = opts.lane[1];\n
}\n
var result = [];\n
for (var lane = lStart; lane <= lEnd; lane += 1) {\n
for (var frame = fStart; frame <= fEnd; frame += 1) {\n
result.push(template\n
.replace(lPlacer, padNumber(lane, digits, '0'))\n
.replace(fPlacer, padNumber(frame, digits, '0')));\n
}\n
}\n
return result;\n
}\n
\n
/**\n
* The namespace that is used to bind functions to DOM events and store the data object\n
*/\n
var namespace = 'spritespin';\n
/**\n
* Event names that are recognized by SpriteSpin. A module can implement any of these and they will be bound\n
* to the target element on which the plugin is called.\n
*/\n
var eventNames = [\n
'mousedown',\n
'mousemove',\n
'mouseup',\n
'mouseenter',\n
'mouseover',\n
'mouseleave',\n
'mousewheel',\n
'wheel',\n
'click',\n
'dblclick',\n
'touchstart',\n
'touchmove',\n
'touchend',\n
'touchcancel',\n
'selectstart',\n
'gesturestart',\n
'gesturechange',\n
'gestureend'\n
];\n
/**\n
*\n
*/\n
var callbackNames = [\n
'onInit',\n
'onProgress',\n
'onLoad',\n
'onFrameChanged',\n
'onFrame',\n
'onDraw',\n
'onComplete',\n
'onDestroy'\n
];\n
/**\n
* Names of events for that the default behavior should be prevented.\n
*/\n
var eventsToPrevent = [\n
'dragstart'\n
];\n
/**\n
* Default set of SpriteSpin options. This also represents the majority of data attributes that are used during the\n
* lifetime of a SpriteSpin instance. The data is stored inside the target DOM element on which the plugin is called.\n
*/\n
var defaults = {\n
source: undefined,\n
width: undefined,\n
height: undefined,\n
frames: undefined,\n
framesX: undefined,\n
lanes: 1,\n
sizeMode: undefined,\n
renderer: 'canvas',\n
lane: 0,\n
frame: 0,\n
frameTime: 40,\n
animate: true,\n
retainAnimate: false,\n
reverse: false,\n
loop: true,\n
stopFrame: 0,\n
wrap: true,\n
wrapLane: false,\n
sense: 1,\n
senseLane: undefined,\n
orientation: 'horizontal',\n
detectSubsampling: true,\n
preloadCount: undefined,\n
touchScrollTimer: [200, 1500],\n
responsive: undefined,\n
plugins: undefined\n
};\n
\n
function noop$1() {\n
// noop\n
}\n
function wrapConsole(type) {\n
return console && console[type] ? function () {\n
var args = [];\n
for (var _i = 0; _i < arguments.length; _i++) {\n
args[_i] = arguments[_i];\n
}\n
return console.log.apply(console, args);\n
} : noop$1;\n
}\n
var log = wrapConsole('log');\n
var warn = wrapConsole('warn');\n
var error = wrapConsole('error');\n
function toArray(value) {\n
return Array.isArray(value) ? value : [value];\n
}\n
/**\n
* clamps the given value by the given min and max values\n
*/\n
function clamp(value, min, max) {\n
return (value > max ? max : (value < min ? min : value));\n
}\n
/**\n
*\n
*/\n
function wrap(value, min, max, size) {\n
while (value > max) {\n
value -= size;\n
}\n
while (value < min) {\n
value += size;\n
}\n
return value;\n
}\n
/**\n
* prevents default action on the given event\n
*/\n
function prevent(e) {\n
e.preventDefault();\n
return false;\n
}\n
/**\n
* Binds on the given target and event the given function.\n
* The SpriteSpin namespace is attached to the event name\n
*/\n
function bind(target, event, func) {\n
if (func) {\n
target.bind(event + '.' + namespace, function (e) {\n
func.apply(target, [e, target.spritespin('data')]);\n
});\n
}\n
}\n
/**\n
* Unbinds all SpriteSpin events from given target element\n
*/\n
function unbind(target) {\n
target.unbind('.' + namespace);\n
}\n
/**\n
* Checks if given object is a function\n
*/\n
function isFunction(fn) {\n
return typeof fn === 'function';\n
}\n
function pixelRatio(context) {\n
var devicePixelRatio = window.devicePixelRatio || 1;\n
var backingStoreRatio = context.webkitBackingStorePixelRatio ||\n
context.mozBackingStorePixelRatio ||\n
context.msBackingStorePixelRatio ||\n
context.oBackingStorePixelRatio ||\n
context.backingStorePixelRatio || 1;\n
return devicePixelRatio / backingStoreRatio;\n
}\n
\n
/**\n
* Applies css attributes to layout the SpriteSpin containers.\n
*\n
* @internal\n
*/\n
function applyLayout(data) {\n
// disable selection\n
data.target\n
.attr('unselectable', 'on')\n
.css({\n
width: '',\n
height: '',\n
'-ms-user-select': 'none',\n
'-moz-user-select': 'none',\n
'-khtml-user-select': 'none',\n
'-webkit-user-select': 'none',\n
'user-select': 'none'\n
});\n
var size = data.responsive ? getComputedSize(data) : getOuterSize(data);\n
var layout = getInnerLayout(data.sizeMode, getInnerSize(data), size);\n
// apply layout on target\n
data.target.css({\n
width: size.width,\n
height: size.height,\n
position: 'relative',\n
overflow: 'hidden'\n
});\n
// apply layout on stage\n
data.stage\n
.css(layout)\n
.hide();\n
if (!data.canvas) {\n
return;\n
}\n
// apply layout on canvas\n
data.canvas.css(layout).hide();\n
// apply pixel ratio on canvas\n
data.canvasRatio = data.canvasRatio || pixelRatio(data.context);\n
if (typeof layout.width === 'number' && typeof layout.height === 'number') {\n
data.canvas[0].width = (layout.width * data.canvasRatio) || size.width;\n
data.canvas[0].height = (layout.height * data.canvasRatio) || size.height;\n
}\n
else {\n
data.canvas[0].width = (size.width * data.canvasRatio);\n
data.canvas[0].height = (size.height * data.canvasRatio);\n
}\n
// width and height must be set before calling scale\n
data.context.scale(data.canvasRatio, data.canvasRatio);\n
}\n
\n
/**\n
* Gets a state object by name.\n
* @internal\n
* @param data - The SpriteSpin instance data\n
* @param name - The name of the state object\n
*/\n
function getState(data, name) {\n
data.state = data.state || {};\n
data.state[name] = data.state[name] || {};\n
return data.state[name];\n
}\n
/**\n
* Gets a plugin state object by name.\n
*\n
* @remarks\n
* Plugins should use this method to get or create a state object where they can\n
* store any instance variables.\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
* @param name - The name of the plugin\n
*/\n
function getPluginState(data, name) {\n
var state = getState(data, 'plugin');\n
state[name] = state[name] || {};\n
return state[name];\n
}\n
/**\n
* Checks whether a flag is set. See {@link flag}.\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
* @param key - The name of the flag\n
*/\n
function is(data, key) {\n
return !!getState(data, 'flags')[key];\n
}\n
/**\n
* Sets a flag value. See {@link is}.\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
* @param key - The name of the flag\n
* @param value - The value to set\n
*/\n
function flag(data, key, value) {\n
getState(data, 'flags')[key] = !!value;\n
}\n
\n
/**\n
* Gets the playback state\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
*/\n
function getPlaybackState(data) {\n
return getState(data, 'playback');\n
}\n
function updateLane(data, lane) {\n
data.lane = data.wrapLane\n
? wrap(lane, 0, data.lanes - 1, data.lanes)\n
: clamp(lane, 0, data.lanes - 1);\n
}\n
function updateAnimationFrame(data) {\n
data.frame += (data.reverse ? -1 : 1);\n
// wrap the frame value to fit in range [0, data.frames)\n
data.frame = wrap(data.frame, 0, data.frames - 1, data.frames);\n
// stop animation if loop is disabled and the stopFrame is reached\n
if (!data.loop && (data.frame === data.stopFrame)) {\n
stopAnimation(data);\n
}\n
}\n
function updateInputFrame(data, frame) {\n
data.frame = Number(frame);\n
data.frame = data.wrap\n
? wrap(data.frame, 0, data.frames - 1, data.frames)\n
: clamp(data.frame, 0, data.frames - 1);\n
}\n
function updateAnimation(data) {\n
var state = getPlaybackState(data);\n
if (state.handler) {\n
updateBefore(data);\n
updateAnimationFrame(data);\n
updateAfter(data);\n
}\n
}\n
function updateBefore(data) {\n
var state = getPlaybackState(data);\n
state.lastFrame = data.frame;\n
state.lastLane = data.lane;\n
}\n
function updateAfter(data) {\n
var state = getPlaybackState(data);\n
if (state.lastFrame !== data.frame || state.lastLane !== data.lane) {\n
data.target.trigger('onFrameChanged.' + namespace, data);\n
}\n
data.target.trigger('onFrame.' + namespace, data);\n
data.target.trigger('onDraw.' + namespace, data);\n
}\n
/**\n
* Updates the frame or lane number of the SpriteSpin data.\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
* @param frame - The frame number to set\n
* @param lane - The lane number to set\n
*/\n
function updateFrame(data, frame, lane) {\n
updateBefore(data);\n
if (frame != null) {\n
updateInputFrame(data, frame);\n
}\n
if (lane != null) {\n
updateLane(data, lane);\n
}\n
updateAfter(data);\n
}\n
/**\n
* Stops the running animation.\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
*/\n
function stopAnimation(data) {\n
data.animate = false;\n
var state = getPlaybackState(data);\n
if (state.handler != null) {\n
window.clearInterval(state.handler);\n
state.handler = null;\n
}\n
}\n
/**\n
* Starts animation playback if needed.\n
*\n
* @remarks\n
* Starts animation playback if `animate` property is `true` and the animation is not yet running.\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
*/\n
function applyAnimation(data) {\n
var state = getPlaybackState(data);\n
if (state.handler && (!data.animate || state.frameTime !== data.frameTime)) {\n
stopAnimation(data);\n
}\n
if (data.animate && !state.handler) {\n
state.frameTime = data.frameTime;\n
state.handler = window.setInterval(function () { return updateAnimation(data); }, state.frameTime);\n
}\n
}\n
/**\n
* Starts the animation playback\n
*\n
* @remarks\n
* Starts the animation playback and also sets the `animate` property to `true`\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
*/\n
function startAnimation(data) {\n
data.animate = true;\n
applyAnimation(data);\n
}\n
\n
var plugins = {};\n
/**\n
* Registers a plugin.\n
*\n
* @remarks\n
* Use this to add custom Rendering or Updating modules that can be addressed with the 'module' option.\n
*\n
* @public\n
* @param name - The name of the plugin\n
* @param plugin - The plugin implementation\n
*/\n
function registerPlugin(name, plugin) {\n
if (plugins[name]) {\n
error("Plugin name \"" + name + "\" is already taken");\n
return;\n
}\n
plugin = plugin || {};\n
plugins[name] = plugin;\n
return plugin;\n
}\n
/**\n
* Registers a plugin.\n
*\n
* @public\n
* @deprecated Use {@link registerPlugin} instead\n
* @param name - The name of the plugin\n
* @param plugin - The plugin implementation\n
*/\n
function registerModule(name, plugin) {\n
warn('"registerModule" is deprecated, use "registerPlugin" instead');\n
registerPlugin(name, plugin);\n
}\n
/**\n
* Gets an active plugin by name\n
*\n
* @internal\n
* @param name - The name of the plugin\n
*/\n
function getPlugin(name) {\n
return plugins[name];\n
}\n
/**\n
* Replaces module names on given SpriteSpin data and replaces them with actual implementations.\n
* @internal\n
*/\n
function applyPlugins(data) {\n
fixPlugins(data);\n
for (var i = 0; i < data.plugins.length; i += 1) {\n
var name_1 = data.plugins[i];\n
if (typeof name_1 !== 'string') {\n
continue;\n
}\n
var plugin = getPlugin(name_1);\n
if (!plugin) {\n
error('No plugin found with name ' + name_1);\n
continue;\n
}\n
data.plugins[i] = plugin;\n
}\n
}\n
function fixPlugins(data) {\n
// tslint:disable no-string-literal\n
if (data['mods']) {\n
warn('"mods" option is deprecated, use "plugins" instead');\n
data.plugins = data['mods'];\n
delete data['mods'];\n
}\n
if (data['behavior']) {\n
warn('"behavior" option is deprecated, use "plugins" instead');\n
data.plugins.push(data['behavior']);\n
delete data['behavior'];\n
}\n
if (data['module']) {\n
warn('"module" option is deprecated, use "plugins" instead');\n
data.plugins.push(data['module']);\n
delete data['module'];\n
}\n
}\n
\n
var $$2 = $$1;\n
var counter = 0;\n
/**\n
* Collection of all SpriteSpin instances\n
*/\n
var instances = {};\n
function pushInstance(data) {\n
counter += 1;\n
data.id = String(counter);\n
instances[data.id] = data;\n
}\n
function popInstance(data) {\n
delete instances[data.id];\n
}\n
function eachInstance(cb) {\n
for (var id in instances) {\n
if (instances.hasOwnProperty(id)) {\n
cb(instances[id]);\n
}\n
}\n
}\n
var lazyinit = function () {\n
// replace function with a noop\n
// this logic must run only once\n
lazyinit = function () { };\n
function onEvent(eventName, e) {\n
eachInstance(function (data) {\n
for (var _i = 0, _a = data.plugins; _i < _a.length; _i++) {\n
var module_1 = _a[_i];\n
if (typeof module_1[eventName] === 'function') {\n
module_1[eventName].apply(data.target, [e, data]);\n
}\n
}\n
});\n
}\n
function onResize() {\n
eachInstance(function (data) {\n
if (data.responsive) {\n
boot(data);\n
}\n
});\n
}\n
var _loop_1 = function (eventName) {\n
$$2(window.document).bind(eventName + '.' + namespace, function (e) {\n
onEvent('document' + eventName, e);\n
});\n
};\n
for (var _i = 0, eventNames_1 = eventNames; _i < eventNames_1.length; _i++) {\n
var eventName = eventNames_1[_i];\n
_loop_1(eventName);\n
}\n
var resizeTimeout = null;\n
$$2(window).on('resize', function () {\n
window.clearTimeout(resizeTimeout);\n
resizeTimeout = window.setTimeout(onResize, 100);\n
});\n
};\n
/**\n
* (re)binds all spritespin events on the target element\n
*\n
* @internal\n
*/\n
function applyEvents(data) {\n
var target = data.target;\n
// Clear all SpriteSpin events on the target element\n
unbind(target);\n
// disable all default browser behavior on the following events\n
// mainly prevents image drag operation\n
for (var _i = 0, eventsToPrevent_1 = eventsToPrevent; _i < eventsToPrevent_1.length; _i++) {\n
var eName = eventsToPrevent_1[_i];\n
bind(target, eName, prevent);\n
}\n
// Bind module functions to SpriteSpin events\n
for (var _a = 0, _b = data.plugins; _a < _b.length; _a++) {\n
var plugin = _b[_a];\n
for (var _c = 0, eventNames_2 = eventNames; _c < eventNames_2.length; _c++) {\n
var eName = eventNames_2[_c];\n
bind(target, eName, plugin[eName]);\n
}\n
for (var _d = 0, callbackNames_1 = callbackNames; _d < callbackNames_1.length; _d++) {\n
var eName = callbackNames_1[_d];\n
bind(target, eName, plugin[eName]);\n
}\n
}\n
// bind auto start function to load event.\n
// bind(target, 'onLoad', function (e, d) {\n
// applyAnimation(d);\n
// });\n
// bind all user events that have been passed on initialization\n
for (var _e = 0, callbackNames_2 = callbackNames; _e < callbackNames_2.length; _e++) {\n
var eName = callbackNames_2[_e];\n
bind(target, eName, data[eName]);\n
}\n
}\n
function applyMetrics(data) {\n
if (!data.images) {\n
data.metrics = [];\n
}\n
data.metrics = measure(data.images, data);\n
var spec = findSpecs(data.metrics, data.frames, 0, 0);\n
if (spec.sprite) {\n
// TODO: try to remove frameWidth/frameHeight\n
data.frameWidth = spec.sprite.width;\n
data.frameHeight = spec.sprite.height;\n
}\n
}\n
/**\n
* Runs the boot process.\n
*\n
* @remarks\n
* (re)initializes plugins, (re)initializes the layout, (re)binds events and loads source images.\n
*\n
* @internal\n
*/\n
function boot(data) {\n
applyPlugins(data);\n
applyEvents(data);\n
applyLayout(data);\n
data.source = toArray(data.source);\n
data.loading = true;\n
data.target\n
.addClass('loading')\n
.trigger('onInit.' + namespace, data);\n
preload({\n
source: data.source,\n
crossOrigin: data.crossOrigin,\n
preloadCount: data.preloadCount,\n
progress: function (progress) {\n
data.progress = progress;\n
data.target.trigger('onProgress.' + namespace, data);\n
},\n
complete: function (images) {\n
data.images = images;\n
data.loading = false;\n
data.frames = data.frames || images.length;\n
applyMetrics(data);\n
applyLayout(data);\n
data.stage.show();\n
data.target\n
.removeClass('loading')\n
.trigger('onLoad.' + namespace, data)\n
.trigger('onFrame.' + namespace, data)\n
.trigger('onDraw.' + namespace, data)\n
.trigger('onComplete.' + namespace, data);\n
}\n
});\n
}\n
/**\n
* Creates a new SpriteSpin instance\n
*\n
* @public\n
*/\n
function create(options) {\n
var _this = this;\n
var target = options.target;\n
// SpriteSpin is not initialized\n
// Create default settings object and extend with given options\n
var data = $$2.extend(true, {}, defaults, options);\n
// ensure source is set\n
data.source = data.source || [];\n
// ensure plugins are set\n
data.plugins = data.plugins || [\n
'360',\n
'drag'\n
];\n
// if image tags are contained inside this DOM element\n
// use these images as the source files\n
target.find('img').each(function () {\n
if (!Array.isArray(data.source)) {\n
data.source = [];\n
}\n
data.source.push($$2(_this).attr('src'));\n
});\n
// build inner html\n
// <div>\n
// <div class='spritespin-stage'></div>\n
// <canvas class='spritespin-canvas'></canvas>\n
// </div>\n
target\n
.empty()\n
.addClass('spritespin-instance')\n
.append("<div class='spritespin-stage'></div>");\n
// add the canvas element if canvas rendering is enabled and supported\n
if (data.renderer === 'canvas') {\n
var canvas = document.createElement('canvas');\n
if (!!(canvas.getContext && canvas.getContext('2d'))) {\n
data.canvas = $$2(canvas).addClass('spritespin-canvas');\n
data.context = canvas.getContext('2d');\n
target.append(data.canvas);\n
target.addClass('with-canvas');\n
}\n
else {\n
// fallback to image rendering mode\n
data.renderer = 'image';\n
}\n
}\n
// setup references to DOM elements\n
data.target = target;\n
data.stage = target.find('.spritespin-stage');\n
// store the data\n
target.data(namespace, data);\n
pushInstance(data);\n
return data;\n
}\n
/**\n
* Creates a new SpriteSpin instance, or updates an existing one\n
*\n
* @public\n
*/\n
function createOrUpdate(options) {\n
lazyinit();\n
var data = options.target.data(namespace);\n
if (!data) {\n
data = create(options);\n
}\n
else {\n
$$2.extend(data, options);\n
}\n
boot(data);\n
return data;\n
}\n
/**\n
* Destroys the SpriteSpin instance\n
*\n
* @remarks\n
* - stops running animation\n
* - unbinds all events\n
* - deletes the data on the target element\n
*\n
* @public\n
*/\n
function destroy(data) {\n
popInstance(data);\n
stopAnimation(data);\n
data.target\n
.trigger('onDestroy', data)\n
.html(null)\n
.attr('style', null)\n
.attr('unselectable', null)\n
.removeClass(['spritespin-instance', 'with-canvas']);\n
unbind(data.target);\n
data.target.removeData(namespace);\n
}\n
\n
/**\n
* Gets the current input state\n
*\n
* @public\n
* @param data - The SpriteSpin instance data\n
*/\n
function getInputState(data) {\n
return getState(data, 'input');\n
}\n
/**\n
* Updates the input state using a mouse or touch event.\n
*\n
* @public\n
* @param e - The input event\n
* @param data - The SpriteSpin instance data\n
*/\n
function updateInput(e, data) {\n
var cursor = getCursorPosition(e);\n
var state = getInputState(data);\n
// cache positions from previous frame\n
state.oldX = state.currentX;\n
state.oldY = state.currentY;\n
state.currentX = cursor.x;\n
state.currentY = cursor.y;\n
// Fix old position.\n
if (state.oldX === undefined || state.oldY === undefined) {\n
state.oldX = state.currentX;\n
state.oldY = state.currentY;\n
}\n
// Cache the initial click/touch position and store the frame number at which the click happened.\n
// Useful for different behavior implementations. This must be restored when the click/touch is released.\n
if (state.startX === undefined || state.startY === undefined) {\n
state.startX = state.currentX;\n
state.startY = state.currentY;\n
state.clickframe = data.frame;\n
state.clicklane = data.lane;\n
}\n
// Calculate the vector from start position to current pointer position.\n
state.dX = state.currentX - state.startX;\n
state.dY = state.currentY - state.startY;\n
// Calculate the vector from last frame position to current pointer position.\n
state.ddX = state.currentX - state.oldX;\n
state.ddY = state.currentY - state.oldY;\n
// Normalize vectors to range [-1:+1]\n
state.ndX = state.dX / data.target.innerWidth();\n
state.ndY = state.dY / data.target.innerHeight();\n
state.nddX = state.ddX / data.target.innerWidth();\n
state.nddY = state.ddY / data.target.innerHeight();\n
}\n
/**\n
* Resets the input state.\n
*\n
* @public\n
*/\n
function resetInput(data) {\n
var input = getInputState(data);\n
input.startX = input.startY = undefined;\n
input.currentX = input.currentY = undefined;\n
input.oldX = input.oldY = undefined;\n
input.dX = input.dY = 0;\n
input.ddX = input.ddY = 0;\n
input.ndX = input.ndY = 0;\n
input.nddX = input.nddY = 0;\n
}\n
\n
function extension(option, value) {\n
var $target = $$1(this);\n
if (option === 'data') {\n
return $target.data(namespace);\n
}\n
if (option === 'api') {\n
var data = $target.data(namespace);\n
data.api = data.api || new Api(data);\n
return data.api;\n
}\n
if (option === 'destroy') {\n
return $target.each(function () {\n
var data = $target.data(namespace);\n
if (data) {\n
destroy(data);\n
}\n
});\n
}\n
if (arguments.length === 2 && typeof option === 'string') {\n
option = (_a = {}, _a[option] = value, _a);\n
}\n
if (typeof option === 'object') {\n
return createOrUpdate($$1.extend(true, { target: $target }, option)).target;\n
}\n
throw new Error('Invalid call to spritespin');\n
var _a;\n
}\n
$$1.fn[namespace] = extension;\n
\n
// tslint:disable:object-literal-shorthand\n
// tslint:disable:only-arrow-functions\n
extendApi({\n
// Gets a value indicating whether the animation is currently running.\n
isPlaying: function () {\n
return getPlaybackState(this.data).handler != null;\n
},\n
// Gets a value indicating whether the animation looping is enabled.\n
isLooping: function () {\n
return this.data.loop;\n
},\n
// Starts/Stops the animation playback\n
toggleAnimation: function () {\n
if (this.isPlaying()) {\n
this.stopAnimation();\n
}\n
else {\n
this.startAnimation();\n
}\n
},\n
// Stops animation playback\n
stopAnimation: function () {\n
this.data.animate = false;\n
stopAnimation(this.data);\n
},\n
// Starts animation playback\n
startAnimation: function () {\n
this.data.animate = true;\n
applyAnimation(this.data);\n
},\n
// Sets a value indicating whether the animation should be looped or not.\n
// This might start the animation (if the 'animate' data attribute is set to true)\n
loop: function (value) {\n
this.data.loop = value;\n
applyAnimation(this.data);\n
return this;\n
},\n
// Gets the current frame number\n
currentFrame: function () {\n
return this.data.frame;\n
},\n
// Updates SpriteSpin to the specified frame.\n
updateFrame: function (frame) {\n
updateFrame(this.data, frame);\n
return this;\n
},\n
// Skips the given number of frames\n
skipFrames: function (step) {\n
var data = this.data;\n
updateFrame(data, data.frame + (data.reverse ? -step : +step));\n
return this;\n
},\n
// Updates SpriteSpin so that the next frame is shown\n
nextFrame: function () {\n
return this.skipFrames(1);\n
},\n
// Updates SpriteSpin so that the previous frame is shown\n
prevFrame: function () {\n
return this.skipFrames(-1);\n
},\n
// Starts the animations that will play until the given frame number is reached\n
// options:\n
// force [boolean] starts the animation, even if current frame is the target frame\n
// nearest [boolean] animates to the direction with minimum distance to the target frame\n
playTo: function (frame, options) {\n
var data = this.data;\n
options = options || {};\n
if (!options.force && data.frame === frame) {\n
return;\n
}\n
if (options.nearest) {\n
// distance to the target frame\n
var a = frame - data.frame;\n
// distance to last frame and the to target frame\n
var b = frame > data.frame ? a - data.frames : a + data.frames;\n
// minimum distance\n
var c = Math.abs(a) < Math.abs(b) ? a : b;\n
data.reverse = c < 0;\n
}\n
data.animate = true;\n
data.loop = false;\n
data.stopFrame = frame;\n
applyAnimation(data);\n
return this;\n
}\n
});\n
\n
function pick(target, names) {\n
for (var _i = 0, names_1 = names; _i < names_1.length; _i++) {\n
var name_1 = names_1[_i];\n
if (target[name_1] || name_1 in target) {\n
return name_1;\n
}\n
}\n
return names[0];\n
}\n
var browser = {\n
requestFullscreen: pick(document.documentElement, [\n
'requestFullscreen',\n
'webkitRequestFullScreen',\n
'mozRequestFullScreen',\n
'msRequestFullscreen'\n
]),\n
exitFullscreen: pick(document, [\n
'exitFullscreen',\n
'webkitExitFullscreen',\n
'webkitCancelFullScreen',\n
'mozCancelFullScreen',\n
'msExitFullscreen'\n
]),\n
fullscreenElement: pick(document, [\n
'fullscreenElement',\n
'webkitFullscreenElement',\n
'webkitCurrentFullScreenElement',\n
'mozFullScreenElement',\n
'msFullscreenElement'\n
]),\n
fullscreenEnabled: pick(document, [\n
'fullscreenEnabled',\n
'webkitFullscreenEnabled',\n
'mozFullScreenEnabled',\n
'msFullscreenEnabled'\n
]),\n
fullscreenchange: pick(document, [\n
'onfullscreenchange',\n
'onwebkitfullscreenchange',\n
'onmozfullscreenchange',\n
'onMSFullscreenChange'\n
]).replace(/^on/, ''),\n
fullscreenerror: pick(document, [\n
'onfullscreenerror',\n
'onwebkitfullscreenerror',\n
'onmozfullscreenerror',\n
'onMSFullscreenError'\n
]).replace(/^on/, '')\n
};\n
var changeEvent = browser.fullscreenchange + '.' + namespace + '-fullscreen';\n
function unbindChangeEvent() {\n
$$1(document).unbind(changeEvent);\n
}\n
function bindChangeEvent(callback) {\n
unbindChangeEvent();\n
$$1(document).bind(changeEvent, callback);\n
}\n
var orientationEvent = 'orientationchange.' + namespace + '-fullscreen';\n
function unbindOrientationEvent() {\n
$$1(window).unbind(orientationEvent);\n
}\n
function bindOrientationEvent(callback) {\n
unbindOrientationEvent();\n
$$1(window).bind(orientationEvent, callback);\n
}\n
function requestFullscreenNative(e) {\n
e = e || document.documentElement;\n
e[browser.requestFullscreen]();\n
}\n
function exitFullscreen() {\n
return document[browser.exitFullscreen]();\n
}\n
function fullscreenEnabled() {\n
return document[browser.fullscreenEnabled];\n
}\n
function fullscreenElement() {\n
return document[browser.fullscreenElement];\n
}\n
function isFullscreen() {\n
return !!fullscreenElement();\n
}\n
function toggleFullscreen(data, opts) {\n
if (isFullscreen()) {\n
this.apiRequestFullscreen(opts);\n
}\n
else {\n
this.exitFullscreen();\n
}\n
}\n
function requestFullscreen(data, opts) {\n
opts = opts || {};\n
var oWidth = data.width;\n
var oHeight = data.height;\n
var oSource = data.source;\n
var oSize = data.sizeMode;\n
var oResponsive = data.responsive;\n
var enter = function () {\n
data.width = window.screen.width;\n
data.height = window.screen.height;\n
data.source = (opts.source || oSource);\n
data.sizeMode = opts.sizeMode || 'fit';\n
data.responsive = false;\n
boot(data);\n
};\n
var exit = function () {\n
data.width = oWidth;\n
data.height = oHeight;\n
data.source = oSource;\n
data.sizeMode = oSize;\n
data.responsive = oResponsive;\n
boot(data);\n
};\n
bindChangeEvent(function () {\n
if (isFullscreen()) {\n
enter();\n
bindOrientationEvent(enter);\n
}\n
else {\n
unbindChangeEvent();\n
unbindOrientationEvent();\n
exit();\n
}\n
});\n
requestFullscreenNative(data.target[0]);\n
}\n
extendApi({\n
fullscreenEnabled: fullscreenEnabled,\n
fullscreenElement: fullscreenElement,\n
exitFullscreen: exitFullscreen,\n
toggleFullscreen: function (opts) {\n
toggleFullscreen(this.data, opts);\n
},\n
requestFullscreen: function (opts) {\n
requestFullscreen(this.data, opts);\n
}\n
});\n
\n
(function () {\n
var NAME = 'click';\n
function click(e, data) {\n
if (data.loading || !data.stage.is(':visible')) {\n
return;\n
}\n
updateInput(e, data);\n
var input = getInputState(data);\n
var half, pos;\n
var target = data.target, offset = target.offset();\n
if (data.orientation === 'horizontal') {\n
half = target.innerWidth() / 2;\n
pos = input.currentX - offset.left;\n
}\n
else {\n
half = target.innerHeight() / 2;\n
pos = input.currentY - offset.top;\n
}\n
updateFrame(data, data.frame + (pos > half ? 1 : -1));\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
mouseup: click,\n
touchend: click\n
});\n
})();\n
\n
(function () {\n
var NAME = 'drag';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function getAxis(data) {\n
if (typeof data.orientation === 'number') {\n
return data.orientation * Math.PI / 180;\n
}\n
if (data.orientation === 'horizontal') {\n
return 0;\n
}\n
return Math.PI / 2;\n
}\n
function onInit(e, data) {\n
var state = getState$$1(data);\n
var d = [200, 1500];\n
var t = data.touchScrollTimer || d;\n
state.minTime = t[0] || d[0];\n
state.maxTime = t[1] || d[1];\n
}\n
function dragStart(e, data) {\n
var state = getState$$1(data);\n
if (data.loading || is(data, 'dragging') || data['zoomPinFrame'] && !data.stage.is(':visible')) {\n
return;\n
}\n
// Touch scroll can only be disabled by cancelling the 'touchstart' event.\n
// If we would try to cancel the 'touchmove' event during a scroll\n
// chrome browser raises an error\n
//\n
// When a user interacts with sprite spin, we don't know whether the intention\n
// is to scroll the page or to roll the spin.\n
//\n
// On first interaction with SpriteSpin the scroll is not disabled\n
// On double tap within 200ms the scroll is not disabled\n
// Scroll is only disabled if there was an interaction with SpriteSpin in the past 1500ms\n
var now = new Date().getTime();\n
if (state.endAt && (now - state.endAt > state.maxTime)) {\n
// reset timer if the user has no interaction with spritespin within 1500ms\n
state.startAt = null;\n
state.endAt = null;\n
}\n
if (state.startAt && (now - state.startAt > state.minTime)) {\n
// disable scroll only if there was already an interaction with spritespin\n
// however, allow scrolling on double tab within 200ms\n
e.preventDefault();\n
}\n
state.startAt = now;\n
state.wasPlaying = !!getPlaybackState(data).handler;\n
state.frame = data.frame || 0;\n
state.lane = data.lane || 0;\n
flag(data, 'dragging', true);\n
updateInput(e, data);\n
}\n
function dragEnd(e, data) {\n
if (is(data, 'dragging')) {\n
getState$$1(data).endAt = new Date().getTime();\n
flag(data, 'dragging', false);\n
resetInput(data);\n
if (data.retainAnimate && getState$$1(data).wasPlaying) {\n
startAnimation(data);\n
}\n
}\n
}\n
function drag(e, data) {\n
var state = getState$$1(data);\n
var input = getInputState(data);\n
if (!is(data, 'dragging')) {\n
return;\n
}\n
updateInput(e, data);\n
var rad = getAxis(data);\n
var sn = Math.sin(rad);\n
var cs = Math.cos(rad);\n
var x = ((input.nddX * cs - input.nddY * sn) * data.sense) || 0;\n
var y = ((input.nddX * sn + input.nddY * cs) * (data.senseLane || data.sense)) || 0;\n
// accumulate\n
state.frame += data.frames * x;\n
state.lane += data.lanes * y;\n
// update spritespin\n
var oldFrame = data.frame;\n
var oldLane = data.lane;\n
updateFrame(data, Math.floor(state.frame), Math.floor(state.lane));\n
stopAnimation(data);\n
}\n
function mousemove(e, data) {\n
dragStart(e, data);\n
drag(e, data);\n
}\n
registerPlugin('drag', {\n
name: 'drag',\n
onInit: onInit,\n
mousedown: dragStart,\n
mousemove: drag,\n
mouseup: dragEnd,\n
documentmousemove: drag,\n
documentmouseup: dragEnd,\n
touchstart: dragStart,\n
touchmove: drag,\n
touchend: dragEnd,\n
touchcancel: dragEnd\n
});\n
registerPlugin('move', {\n
name: 'move',\n
onInit: onInit,\n
mousemove: mousemove,\n
mouseleave: dragEnd,\n
touchstart: dragStart,\n
touchmove: drag,\n
touchend: dragEnd,\n
touchcancel: dragEnd\n
});\n
})();\n
\n
(function () {\n
var NAME = 'hold';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function rememberOptions(data) {\n
var state = getState$$1(data);\n
state.frameTime = data.frameTime;\n
state.animate = data.animate;\n
state.reverse = data.reverse;\n
}\n
function restoreOptions(data) {\n
var state = getState$$1(data);\n
data.frameTime = state.frameTime;\n
data.animate = state.animate;\n
data.reverse = state.reverse;\n
}\n
function start(e, data) {\n
if (is(data, 'loading') || is(data, 'dragging') || !data.stage.is(':visible')) {\n
return;\n
}\n
rememberOptions(data);\n
updateInput(e, data);\n
flag(data, 'dragging', true);\n
data.animate = true;\n
applyAnimation(data);\n
}\n
function stop(e, data) {\n
flag(data, 'dragging', false);\n
resetInput(data);\n
stopAnimation(data);\n
restoreOptions(data);\n
applyAnimation(data);\n
}\n
function update(e, data) {\n
if (!is(data, 'dragging')) {\n
return;\n
}\n
updateInput(e, data);\n
var input = getInputState(data);\n
var half, delta;\n
var target = data.target, offset = target.offset();\n
if (data.orientation === 'horizontal') {\n
half = target.innerWidth() / 2;\n
delta = (input.currentX - offset.left - half) / half;\n
}\n
else {\n
half = (data.height / 2);\n
delta = (input.currentY - offset.top - half) / half;\n
}\n
data.reverse = delta < 0;\n
delta = delta < 0 ? -delta : delta;\n
data.frameTime = 80 * (1 - delta) + 20;\n
if (((data.orientation === 'horizontal') && (input.dX < input.dY)) ||\n
((data.orientation === 'vertical') && (input.dX < input.dY))) {\n
e.preventDefault();\n
}\n
}\n
function onFrame(e, data) {\n
data.animate = true;\n
applyAnimation(data);\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
mousedown: start,\n
mousemove: update,\n
mouseup: stop,\n
mouseleave: stop,\n
touchstart: start,\n
touchmove: update,\n
touchend: stop,\n
touchcancel: stop,\n
onFrame: onFrame\n
});\n
})();\n
\n
(function () {\n
var NAME = 'swipe';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function getOption(data, name, fallback) {\n
return data[name] || fallback;\n
}\n
function init(e, data) {\n
var state = getState$$1(data);\n
state.fling = getOption(data, 'swipeFling', 10);\n
state.snap = getOption(data, 'swipeSnap', 0.50);\n
}\n
function start(e, data) {\n
if (!data.loading && !is(data, 'dragging')) {\n
updateInput(e, data);\n
flag(data, 'dragging', true);\n
}\n
}\n
function update(e, data) {\n
if (!is(data, 'dragging')) {\n
return;\n
}\n
updateInput(e, data);\n
var frame = data.frame;\n
var lane = data.lane;\n
updateFrame(data, frame, lane);\n
}\n
function end(e, data) {\n
if (!is(data, 'dragging')) {\n
return;\n
}\n
flag(data, 'dragging', false);\n
var state = getState$$1(data);\n
var input = getInputState(data);\n
var frame = data.frame;\n
var lane = data.lane;\n
var snap = state.snap;\n
var fling = state.fling;\n
var dS, dF;\n
if (data.orientation === 'horizontal') {\n
dS = input.ndX;\n
dF = input.ddX;\n
}\n
else {\n
dS = input.ndY;\n
dF = input.ddY;\n
}\n
if (dS >= snap || dF >= fling) {\n
frame = data.frame - 1;\n
}\n
else if (dS <= -snap || dF <= -fling) {\n
frame = data.frame + 1;\n
}\n
resetInput(data);\n
updateFrame(data, frame, lane);\n
stopAnimation(data);\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onLoad: init,\n
mousedown: start,\n
mousemove: update,\n
mouseup: end,\n
mouseleave: end,\n
touchstart: start,\n
touchmove: update,\n
touchend: end,\n
touchcancel: end\n
});\n
})();\n
\n
(function () {\n
var NAME = 'wheel';\n
function wheel(e, data) {\n
if (!data.loading && data.stage.is(':visible')) {\n
e.preventDefault();\n
var we = e.originalEvent;\n
var signX = we.deltaX === 0 ? 0 : we.deltaX > 0 ? 1 : -1;\n
var signY = we.deltaY === 0 ? 0 : we.deltaY > 0 ? 1 : -1;\n
updateFrame(data, data.frame + signY, data.lane + signX);\n
}\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
wheel: wheel\n
});\n
})();\n
\n
(function () {\n
var template = "\n<div class='spritespin-progress'>\n <div class='spritespin-progress-label'></div>\n <div class='spritespin-progress-bar'></div>\n</div>\n";\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
var NAME = 'progress';\n
function onInit(e, data) {\n
var state = getState$$1(data);\n
if (!state.stage) {\n
state.stage = $$1(template);\n
state.stage.appendTo(data.target);\n
}\n
state.stage.find('.spritespin-progress-label')\n
.text("0%")\n
.css({ 'text-align': 'center' });\n
state.stage.find('.spritespin-progress-bar').css({\n
width: "0%"\n
});\n
state.stage.hide().fadeIn();\n
}\n
function onProgress(e, data) {\n
var state = getState$$1(data);\n
state.stage.find('.spritespin-progress-label')\n
.text(data.progress.percent + "%")\n
.css({ 'text-align': 'center' });\n
state.stage.find('.spritespin-progress-bar').css({\n
width: data.progress.percent + "%"\n
});\n
}\n
function onLoad(e, data) {\n
$$1(getState$$1(data).stage).fadeOut();\n
}\n
function onDestroy(e, data) {\n
$$1(getState$$1(data).stage).remove();\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onInit: onInit,\n
onProgress: onProgress,\n
onLoad: onLoad,\n
onDestroy: onDestroy\n
});\n
})();\n
\n
(function () {\n
var NAME = '360';\n
function onLoad(e, data) {\n
data.stage.find('.spritespin-frames').detach();\n
if (data.renderer === 'image') {\n
$(data.images).addClass('spritespin-frames').appendTo(data.stage);\n
}\n
}\n
function onDraw(e, data) {\n
var specs = findSpecs(data.metrics, data.frames, data.frame, data.lane);\n
var sheet = specs.sheet;\n
var sprite = specs.sprite;\n
if (!sheet || !sprite) {\n
return;\n
}\n
var src = data.source[sheet.id];\n
var image = data.images[sheet.id];\n
if (data.renderer === 'canvas') {\n
data.canvas.show();\n
var w = data.canvas[0].width / data.canvasRatio;\n
var h = data.canvas[0].height / data.canvasRatio;\n
data.context.clearRect(0, 0, w, h);\n
data.context.drawImage(image, sprite.sampledX, sprite.sampledY, sprite.sampledWidth, sprite.sampledHeight, 0, 0, w, h);\n
return;\n
}\n
var scaleX = data.stage.innerWidth() / sprite.sampledWidth;\n
var scaleY = data.stage.innerHeight() / sprite.sampledHeight;\n
var top = Math.floor(-sprite.sampledY * scaleY);\n
var left = Math.floor(-sprite.sampledX * scaleX);\n
var width = Math.floor(sheet.sampledWidth * scaleX);\n
var height = Math.floor(sheet.sampledHeight * scaleY);\n
if (data.renderer === 'background') {\n
data.stage.css({\n
'background-image': "url('" + src + "')",\n
'background-position': left + "px " + top + "px",\n
'background-repeat': 'no-repeat',\n
// set custom background size to enable responsive rendering\n
'-webkit-background-size': width + "px " + height + "px",\n
'-moz-background-size': width + "px " + height + "px",\n
'-o-background-size': width + "px " + height + "px",\n
'background-size': width + "px " + height + "px" /* Chrome, Firefox 4+, IE 9+, Opera, Safari 5+ */\n
});\n
return;\n
}\n
$(data.images).hide();\n
$(image).show().css({\n
position: 'absolute',\n
top: top,\n
left: left,\n
'max-width': 'initial',\n
width: width,\n
height: height\n
});\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onLoad: onLoad,\n
onDraw: onDraw\n
});\n
})();\n
\n
(function () {\n
var NAME = 'blur';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function getOption(data, name, fallback) {\n
return data[name] || fallback;\n
}\n
function init(e, data) {\n
var state = getState$$1(data);\n
state.canvas = state.canvas || $$1("<canvas class='blur-layer'></canvas>");\n
state.context = state.context || state.canvas[0].getContext('2d');\n
state.steps = state.steps || [];\n
state.fadeTime = Math.max(getOption(data, 'blurFadeTime', 200), 1);\n
state.frameTime = Math.max(getOption(data, 'blurFrameTime', data.frameTime), 16);\n
state.trackTime = null;\n
state.cssBlur = !!getOption(data, 'blurCss', false);\n
var inner = getInnerSize(data);\n
var outer = data.responsive ? getComputedSize(data) : getOuterSize(data);\n
var css = getInnerLayout(data.sizeMode, inner, outer);\n
state.canvas[0].width = data.width * data.canvasRatio;\n
state.canvas[0].height = data.height * data.canvasRatio;\n
state.canvas.css(css).show();\n
state.context.scale(data.canvasRatio, data.canvasRatio);\n
data.target.append(state.canvas);\n
}\n
function onFrame(e, data) {\n
var state = getState$$1(data);\n
trackFrame(data);\n
if (state.timeout == null) {\n
loop(data);\n
}\n
}\n
function trackFrame(data) {\n
var state = getState$$1(data);\n
var ani = getPlaybackState(data);\n
// distance between frames\n
var d = Math.abs(data.frame - ani.lastFrame);\n
// shortest distance\n
d = d >= data.frames / 2 ? data.frames - d : d;\n
state.steps.unshift({\n
frame: data.frame,\n
lane: data.lane,\n
live: 1,\n
step: state.frameTime / state.fadeTime,\n
d: d,\n
alpha: 0\n
});\n
}\n
var toRemove = [];\n
function removeOldFrames(frames) {\n
toRemove.length = 0;\n
for (var i = 0; i < frames.length; i += 1) {\n
if (frames[i].alpha <= 0) {\n
toRemove.push(i);\n
}\n
}\n
for (var _i = 0, toRemove_1 = toRemove; _i < toRemove_1.length; _i++) {\n
var item = toRemove_1[_i];\n
frames.splice(item, 1);\n
}\n
}\n
function loop(data) {\n
var state = getState$$1(data);\n
state.timeout = window.setTimeout(function () { tick(data); }, state.frameTime);\n
}\n
function killLoop(data) {\n
var state = getState$$1(data);\n
window.clearTimeout(state.timeout);\n
state.timeout = null;\n
}\n
function applyCssBlur(canvas, d) {\n
var amount = Math.min(Math.max((d / 2) - 4, 0), 2.5);\n
var blur = "blur(" + amount + "px)";\n
canvas.css({\n
'-webkit-filter': blur,\n
filter: blur\n
});\n
}\n
function clearFrame(data, state) {\n
state.canvas.show();\n
var w = state.canvas[0].width / data.canvasRatio;\n
var h = state.canvas[0].height / data.canvasRatio;\n
// state.context.clearRect(0, 0, w, h)\n
}\n
function drawFrame(data, state, step) {\n
if (step.alpha <= 0) {\n
return;\n
}\n
var specs = findSpecs(data.metrics, data.frames, step.frame, step.lane);\n
var sheet = specs.sheet;\n
var sprite = specs.sprite;\n
if (!sheet || !sprite) {\n
return;\n
}\n
var src = data.source[sheet.id];\n
var image = data.images[sheet.id];\n
if (image.complete === false) {\n
return;\n
}\n
state.canvas.show();\n
var w = state.canvas[0].width / data.canvasRatio;\n
var h = state.canvas[0].height / data.canvasRatio;\n
state.context.globalAlpha = step.alpha;\n
state.context.drawImage(image, sprite.sampledX, sprite.sampledY, sprite.sampledWidth, sprite.sampledHeight, 0, 0, w, h);\n
}\n
function tick(data) {\n
var state = getState$$1(data);\n
killLoop(data);\n
if (!state.context) {\n
return;\n
}\n
var d = 0;\n
clearFrame(data, state);\n
state.context.clearRect(0, 0, data.width, data.height);\n
for (var _i = 0, _a = state.steps; _i < _a.length; _i++) {\n
var step = _a[_i];\n
step.live = Math.max(step.live - step.step, 0);\n
step.alpha = Math.max(step.live - 0.25, 0);\n
drawFrame(data, state, step);\n
d += step.alpha + step.d;\n
}\n
if (state.cssBlur) {\n
applyCssBlur(state.canvas, d);\n
}\n
removeOldFrames(state.steps);\n
if (state.steps.length) {\n
loop(data);\n
}\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onLoad: init,\n
onFrameChanged: onFrame\n
});\n
})();\n
\n
(function () {\n
var max = Math.max;\n
var min = Math.min;\n
var NAME = 'ease';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function getOption(data, name, fallback) {\n
return data[name] || fallback;\n
}\n
function init(e, data) {\n
var state = getState$$1(data);\n
state.maxSamples = max(getOption(data, 'easeMaxSamples', 5), 0);\n
state.damping = max(min(getOption(data, 'easeDamping', 0.9), 0.999), 0);\n
state.abortTime = max(getOption(data, 'easeAbortTime', 250), 16);\n
state.updateTime = max(getOption(data, 'easeUpdateTime', data.frameTime), 16);\n
state.samples = [];\n
state.steps = [];\n
}\n
function update(e, data) {\n
if (is(data, 'dragging')) {\n
killLoop(data);\n
sampleInput(data);\n
}\n
}\n
function end(e, data) {\n
var state = getState$$1(data);\n
var samples = state.samples;\n
var last;\n
var lanes = 0;\n
var frames = 0;\n
var time = 0;\n
for (var _i = 0, samples_1 = samples; _i < samples_1.length; _i++) {\n
var sample = samples_1[_i];\n
if (!last) {\n
last = sample;\n
continue;\n
}\n
var dt = sample.time - last.time;\n
if (dt > state.abortTime) {\n
lanes = frames = time = 0;\n
return killLoop(data);\n
}\n
frames += sample.frame - last.frame;\n
lanes += sample.lane - last.lane;\n
time += dt;\n
last = sample;\n
}\n
samples.length = 0;\n
if (!time) {\n
return;\n
}\n
state.lane = data.lane;\n
state.lanes = 0;\n
state.laneStep = lanes / time * state.updateTime;\n
state.frame = data.frame;\n
state.frames = 0;\n
state.frameStep = frames / time * state.updateTime;\n
loop(data);\n
}\n
function sampleInput(data) {\n
var state = getState$$1(data);\n
// add a new sample\n
state.samples.push({\n
time: new Date().getTime(),\n
frame: data.frame,\n
lane: data.lane\n
});\n
// drop old samples\n
while (state.samples.length > state.maxSamples) {\n
state.samples.shift();\n
}\n
}\n
function killLoop(data) {\n
var state = getState$$1(data);\n
if (state.handler != null) {\n
window.clearTimeout(state.handler);\n
state.handler = null;\n
}\n
}\n
function loop(data) {\n
var state = getState$$1(data);\n
state.handler = window.setTimeout(function () { tick(data); }, state.updateTime);\n
}\n
function tick(data) {\n
var state = getState$$1(data);\n
state.lanes += state.laneStep;\n
state.frames += state.frameStep;\n
state.laneStep *= state.damping;\n
state.frameStep *= state.damping;\n
var frame = Math.floor(state.frame + state.frames);\n
var lane = Math.floor(state.lane + state.lanes);\n
updateFrame(data, frame, lane);\n
if (is(data, 'dragging')) {\n
killLoop(data);\n
}\n
else if (Math.abs(state.frameStep) > 0.005 || Math.abs(state.laneStep) > 0.005) {\n
loop(data);\n
}\n
else {\n
killLoop(data);\n
}\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onLoad: init,\n
mousemove: update,\n
mouseup: end,\n
mouseleave: end,\n
touchmove: update,\n
touchend: end,\n
touchcancel: end\n
});\n
})();\n
\n
(function () {\n
var NAME = 'gallery';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function getOption(data, name, fallback) {\n
return data[name] || fallback;\n
}\n
function load(e, data) {\n
var state = getState$$1(data);\n
state.images = [];\n
state.offsets = [];\n
state.frame = data.frame;\n
state.speed = getOption(data, 'gallerySpeed', 500);\n
state.opacity = getOption(data, 'galleryOpacity', 0.25);\n
state.stage = getOption(data, 'galleryStage', $$1('<div></div>'));\n
state.stage.empty().addClass('gallery-stage').prependTo(data.stage);\n
var size = 0;\n
for (var _i = 0, _a = data.images; _i < _a.length; _i++) {\n
var image = _a[_i];\n
var naturalSize$$1 = naturalSize(image);\n
var scale = data.height / naturalSize$$1.height;\n
var img = $$1(image);\n
state.stage.append(img);\n
state.images.push(img);\n
state.offsets.push(-size + (data.width - image.width * scale) / 2);\n
size += data.width;\n
img.css({\n
'max-width': 'initial',\n
opacity: state.opacity,\n
width: data.width,\n
height: data.height\n
});\n
}\n
var innerSize = getInnerSize(data);\n
var outerSize = data.responsive ? getComputedSize(data) : getOuterSize(data);\n
var layout = getInnerLayout(data.sizeMode, innerSize, outerSize);\n
state.stage.css(layout).css({ width: size, left: state.offsets[state.frame] });\n
state.images[state.frame].animate({ opacity: 1 }, { duration: state.speed });\n
}\n
function draw(e, data) {\n
var state = getState$$1(data);\n
var input = getInputState(data);\n
var isDragging = is(data, 'dragging');\n
if (state.frame !== data.frame && !isDragging) {\n
state.stage.stop(true, false).animate({ left: state.offsets[data.frame] }, { duration: state.speed });\n
state.images[state.frame].animate({ opacity: state.opacity }, { duration: state.speed });\n
state.frame = data.frame;\n
state.images[state.frame].animate({ opacity: 1 }, { duration: state.speed });\n
state.stage.animate({ left: state.offsets[state.frame] });\n
}\n
else if (isDragging || state.dX !== input.dX) {\n
state.dX = input.dX;\n
state.ddX = input.ddX;\n
state.stage.stop(true, true).css({ left: state.offsets[state.frame] + state.dX });\n
}\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onLoad: load,\n
onDraw: draw\n
});\n
})();\n
\n
(function () {\n
var NAME = 'panorama';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function onLoad(e, data) {\n
var state = getState$$1(data);\n
var sprite = data.metrics[0];\n
if (!sprite) {\n
return;\n
}\n
if (data.orientation === 'horizontal') {\n
state.scale = data.target.innerHeight() / sprite.sampledHeight;\n
data.frames = sprite.sampledWidth;\n
}\n
else {\n
state.scale = data.target.innerWidth() / sprite.sampledWidth;\n
data.frames = sprite.sampledHeight;\n
}\n
var width = Math.floor(sprite.sampledWidth * state.scale);\n
var height = Math.floor(sprite.sampledHeight * state.scale);\n
data.stage.css({\n
'background-image': "url(" + data.source[sprite.id] + ")",\n
'background-repeat': 'repeat-both',\n
// set custom background size to enable responsive rendering\n
'-webkit-background-size': width + "px " + height + "px",\n
'-moz-background-size': width + "px " + height + "px",\n
'-o-background-size': width + "px " + height + "px",\n
'background-size': width + "px " + height + "px" /* Chrome, Firefox 4+, IE 9+, Opera, Safari 5+ */\n
});\n
}\n
function onDraw(e, data) {\n
var state = getState$$1(data);\n
var px = data.orientation === 'horizontal' ? 1 : 0;\n
var py = px ? 0 : 1;\n
var offset = data.frame % data.frames;\n
var left = Math.round(px * offset * state.scale);\n
var top = Math.round(py * offset * state.scale);\n
data.stage.css({ 'background-position': left + "px " + top + "px" });\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
onLoad: onLoad,\n
onDraw: onDraw\n
});\n
})();\n
\n
(function () {\n
var NAME = 'zoom';\n
function getState$$1(data) {\n
return getPluginState(data, NAME);\n
}\n
function getOption(data, name, fallback) {\n
return name in data ? data[name] : fallback;\n
}\n
function onInit(e, data) {\n
var state = getState$$1(data);\n
state.source = getOption(data, 'zoomSource', data.source);\n
state.useWheel = getOption(data, 'zoomUseWheel', false);\n
state.useClick = getOption(data, 'zoomUseClick', true);\n
state.pinFrame = getOption(data, 'zoomPinFrame', true);\n
state.doubleClickTime = getOption(data, 'zoomDoubleClickTime', 500);\n
state.stage = state.stage || $$1("<div class='zoom-stage'></div>");\n
state.stage.css({\n
width: '100%',\n
height: '100%',\n
top: 0,\n
left: 0,\n
bottom: 0,\n
right: 0,\n
position: 'absolute'\n
})\n
.appendTo(data.target)\n
.hide();\n
}\n
function onDestroy(e, data) {\n
var state = getState$$1(data);\n
if (state.stage) {\n
state.stage.remove();\n
delete state.stage;\n
}\n
}\n
function updateInput$$1(e, data) {\n
var state = getState$$1(data);\n
if (!state.stage.is(':visible')) {\n
return;\n
}\n
e.preventDefault();\n
if (state.pinFrame) {\n
// hack into drag/move module and disable dragging\n
// prevents frame change during zoom mode\n
flag(data, 'dragging', false);\n
}\n
// grab touch/cursor position\n
var cursor = getCursorPosition(e);\n
// normalize cursor position into [0:1] range\n
var x = cursor.x / data.width;\n
var y = cursor.y / data.height;\n
if (state.oldX == null) {\n
state.oldX = x;\n
state.oldY = y;\n
}\n
if (state.currentX == null) {\n
state.currentX = x;\n
state.currentY = y;\n
}\n
// calculate move delta since last frame and remember current position\n
var dx = x - state.oldX;\n
var dy = y - state.oldY;\n
state.oldX = x;\n
state.oldY = y;\n
// invert drag direction for touch events to enable 'natural' scrolling\n
if (e.type.match(/touch/)) {\n
dx = -dx;\n
dy = -dy;\n
}\n
// accumulate display coordinates\n
state.currentX = clamp(state.currentX + dx, 0, 1);\n
state.currentY = clamp(state.currentY + dy, 0, 1);\n
updateFrame(data, data.frame, data.lane);\n
}\n
function onClick(e, data) {\n
var state = getState$$1(data);\n
if (!state.useClick) {\n
return;\n
}\n
e.preventDefault();\n
// simulate double click\n
var clickTime = new Date().getTime();\n
if (!state.clickTime) {\n
// on first click\n
state.clickTime = clickTime;\n
return;\n
}\n
// on second click\n
var timeDelta = clickTime - state.clickTime;\n
if (timeDelta > state.doubleClickTime) {\n
// took too long, back to first click\n
state.clickTime = clickTime;\n
return;\n
}\n
// on valid double click\n
state.clickTime = undefined;\n
if (toggleZoom(data)) {\n
updateInput$$1(e, data);\n
}\n
}\n
function onMove(e, data) {\n
var state = getState$$1(data);\n
if (state.stage.is(':visible')) {\n
updateInput$$1(e, data);\n
}\n
}\n
function onDraw(e, data) {\n
var state = getState$$1(data);\n
// calculate the frame index\n
var index = data.lane * data.frames + data.frame;\n
// get the zoom image. Use original frames as fallback. This won't work for sprite sheets\n
var source = state.source[index];\n
var spec = findSpecs(data.metrics, data.frames, data.frame, data.lane);\n
// get display position\n
var x = state.currentX;\n
var y = state.currentY;\n
// fallback to centered position\n
if (x == null) {\n
x = state.currentX = 0.5;\n
y = state.currentY = 0.5;\n
}\n
if (source) {\n
// scale up from [0:1] to [0:100] range\n
x = Math.floor(x * 100);\n
y = Math.floor(y * 100);\n
// update background image and position\n
state.stage.css({\n
'background-repeat': 'no-repeat',\n
'background-image': "url('" + source + "')",\n
'background-position': x + "% " + y + "%"\n
});\n
}\n
else if (spec.sheet && spec.sprite) {\n
var sprite = spec.sprite;\n
var sheet = spec.sheet;\n
var src = data.source[sheet.id];\n
var left = -Math.floor(sprite.sampledX + x * (sprite.sampledWidth - data.width));\n
var top_1 = -Math.floor(sprite.sampledY + y * (sprite.sampledHeight - data.height));\n
var width = sheet.sampledWidth;\n
var height = sheet.sampledHeight;\n
state.stage.css({\n
'background-image': "url('" + src + "')",\n
'background-position': left + "px " + top_1 + "px",\n
'background-repeat': 'no-repeat',\n
// set custom background size to enable responsive rendering\n
'-webkit-background-size': width + "px " + height + "px",\n
'-moz-background-size': width + "px " + height + "px",\n
'-o-background-size': width + "px " + height + "px",\n
'background-size': width + "px " + height + "px" /* Chrome, Firefox 4+, IE 9+, Opera, Safari 5+ */\n
});\n
}\n
}\n
function toggleZoom(data) {\n
var state = getState$$1(data);\n
if (!state.stage) {\n
throw new Error('zoom module is not initialized or is not available.');\n
}\n
if (state.stage.is(':visible')) {\n
showZoom(data);\n
}\n
else {\n
hideZoom(data);\n
return true;\n
}\n
return false;\n
}\n
function showZoom(data) {\n
var state = getState$$1(data);\n
state.stage.fadeOut();\n
data.stage.fadeIn();\n
}\n
function hideZoom(data) {\n
var state = getState$$1(data);\n
state.stage.fadeIn();\n
data.stage.fadeOut();\n
}\n
function wheel(e, data) {\n
var state = getState$$1(data);\n
if (!data.loading && state.useWheel) {\n
var we = e.originalEvent;\n
var signY = we.deltaY === 0 ? 0 : we.deltaY > 0 ? 1 : -1;\n
if (typeof state.useWheel === 'number') {\n
signY *= state.useWheel;\n
}\n
if (state.stage.is(':visible') && signY > 0) {\n
e.preventDefault();\n
showZoom(data);\n
}\n
if (!state.stage.is(':visible') && signY < 0) {\n
e.preventDefault();\n
hideZoom(data);\n
}\n
}\n
}\n
registerPlugin(NAME, {\n
name: NAME,\n
mousedown: onClick,\n
touchstart: onClick,\n
mousemove: onMove,\n
touchmove: onMove,\n
wheel: wheel,\n
onInit: onInit,\n
onDestroy: onDestroy,\n
onDraw: onDraw\n
});\n
extendApi({\n
toggleZoom: function () { toggleZoom(this.data); } // tslint:disable-line\n
});\n
})();\n
\n
var Utils = {\n
$: $$1,\n
bind: bind,\n
clamp: clamp,\n
detectSubsampling: detectSubsampling,\n
error: error,\n
findSpecs: findSpecs,\n
getComputedSize: getComputedSize,\n
getCursorPosition: getCursorPosition,\n
getInnerLayout: getInnerLayout,\n
getInnerSize: getInnerSize,\n
getOuterSize: getOuterSize,\n
isFunction: isFunction,\n
log: log,\n
measure: measure,\n
naturalSize: naturalSize,\n
noop: noop$1,\n
pixelRatio: pixelRatio,\n
preload: preload,\n
prevent: prevent,\n
sourceArray: sourceArray,\n
toArray: toArray,\n
unbind: unbind,\n
warn: warn,\n
wrap: wrap\n
};\n
\n
exports.Utils = Utils;\n
exports.sourceArray = sourceArray;\n
exports.Api = Api;\n
exports.extendApi = extendApi;\n
exports.instances = instances;\n
exports.applyEvents = applyEvents;\n
exports.boot = boot;\n
exports.create = create;\n
exports.createOrUpdate = createOrUpdate;\n
exports.destroy = destroy;\n
exports.namespace = namespace;\n
exports.eventNames = eventNames;\n
exports.callbackNames = callbackNames;\n
exports.eventsToPrevent = eventsToPrevent;\n
exports.defaults = defaults;\n
exports.getInputState = getInputState;\n
exports.updateInput = updateInput;\n
exports.resetInput = resetInput;\n
exports.applyLayout = applyLayout;\n
exports.getPlaybackState = getPlaybackState;\n
exports.updateFrame = updateFrame;\n
exports.stopAnimation = stopAnimation;\n
exports.applyAnimation = applyAnimation;\n
exports.startAnimation = startAnimation;\n
exports.registerPlugin = registerPlugin;\n
exports.registerModule = registerModule;\n
exports.getPlugin = getPlugin;\n
exports.applyPlugins = applyPlugins;\n
exports.getState = getState;\n
exports.getPluginState = getPluginState;\n
exports.is = is;\n
exports.flag = flag;\n
\n
Object.defineProperty(exports, '__esModule', { value: true });\n
\n
})));\n
//# sourceMappingURL=spritespin.js.map\n
</script>\n
<script type='text/javascript'>\n
\n
$("#mySpriteSpin_27").spritespin({\n
// path to the source images.\n
source: [\n
"https://emxmotors.com/public/assets/images/360_new/101.webp",\n
"https://emxmotors.com/public/assets/images/360_new/102.webp",\n
"https://emxmotors.com/public/assets/images/360_new/103.webp",\n
"https://emxmotors.com/public/assets/images/360_new/104.webp",\n
"https://emxmotors.com/public/assets/images/360_new/105.webp",\n
"https://emxmotors.com/public/assets/images/360_new/106.webp",\n
"https://emxmotors.com/public/assets/images/360_new/107.webp",\n
"https://emxmotors.com/public/assets/images/360_new/108.webp",\n
"https://emxmotors.com/public/assets/images/360_new/109.webp",\n
"https://emxmotors.com/public/assets/images/360_new/110.webp",\n
"https://emxmotors.com/public/assets/images/360_new/111.webp",\n
"https://emxmotors.com/public/assets/images/360_new/112.webp",\n
"https://emxmotors.com/public/assets/images/360_new/113.webp",\n
"https://emxmotors.com/public/assets/images/360_new/114.webp",\n
"https://emxmotors.com/public/assets/images/360_new/115.webp",\n
"https://emxmotors.com/public/assets/images/360_new/116.webp",\n
"https://emxmotors.com/public/assets/images/360_new/117.webp",\n
"https://emxmotors.com/public/assets/images/360_new/118.webp",\n
"https://emxmotors.com/public/assets/images/360_new/119.webp",\n
"https://emxmotors.com/public/assets/images/360_new/120.webp",\n
"https://emxmotors.com/public/assets/images/360_new/121.webp",\n
"https://emxmotors.com/public/assets/images/360_new/122.webp",\n
"https://emxmotors.com/public/assets/images/360_new/123.webp",\n
"https://emxmotors.com/public/assets/images/360_new/124.webp",\n
"https://emxmotors.com/public/assets/images/360_new/125.webp",\n
"https://emxmotors.com/public/assets/images/360_new/126.webp",\n
"https://emxmotors.com/public/assets/images/360_new/127.webp",\n
"https://emxmotors.com/public/assets/images/360_new/128.webp",\n
"https://emxmotors.com/public/assets/images/360_new/129.webp",\n
"https://emxmotors.com/public/assets/images/360_new/130.webp",\n
"https://emxmotors.com/public/assets/images/360_new/131.webp",\n
"https://emxmotors.com/public/assets/images/360_new/132.webp",\n
"https://emxmotors.com/public/assets/images/360_new/133.webp",\n
"https://emxmotors.com/public/assets/images/360_new/134.webp",\n
"https://emxmotors.com/public/assets/images/360_new/135.webp",\n
"https://emxmotors.com/public/assets/images/360_new/136.webp",\n
"https://emxmotors.com/public/assets/images/360_new/137.webp",\n
\n
],\n
width : 648, // width in pixels of the window/frame\n
height : 400, // height in pixels of the window/frame\n
});\n
\n
\n
\n
</script>\n
\n
\n
\n
\n
<!-- </body>\n
</html>
"""
"mobile_footer" => """
<footer id="footerMobile" class="footer-area footer-mobile d-lg-none d-xl-none">\n
<div class="container-fluid p-0">\n
<div class="container">\n
<div class="row">\n
<div class="col-12 col-md-8">\n
<div class="single-footer display-mobile">\n
<h5>Subscribe for Newsletter</h5>\n
<div class="row">\n
<div class="col-7 col-md-8">\n
<hr>\n
</div>\n
</div>\n
</div>\n
\n
</div>\n
<div class="col-12 col-md-4">\n
<div class="single-footer display-mobile">\n
<h5>Follow Us</h5>\n
<div class="row">\n
<div class="col-7 col-md-8">\n
<hr>\n
</div>\n
</div>\n
</div>\n
<div class="socials">\n
<ul class="list">\n
<li>\n
<a href="https://www.facebook.com/emxmotorsuae/" class="fab fa-facebook-f" target="_blank"></a>\n
</li>\n
<li>\n
<a href="https://www.twitter.com" class="fab fa-twitter" target="_blank"></a>\n
</li>\n
<li>\n
<a href="https://www.youtube.com/channel/UC92lCaRzfimi_Hrw3MQo7TQ" target="_blank"><i class="fab fa-google"></i></a>\n
</li>\n
<li>\n
<a href="https://www.instagram.com/emxmotorsme/" class="fab fa-linkedin-in" target="_blank"></a>\n
</li>\n
</ul>\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
<div class="container-fluid px-0 footer-inner">\n
<div class="container">\n
<div class="row">\n
<div class="col-12 col-md-4">\n
<div class="single-footer">\n
<h5>About Store</h5>\n
<div class="row">\n
<div class="col-7 col-md-8">\n
<hr>\n
</div>\n
</div>\n
<ul class="contact-list pl-0 mb-0">\n
<li> <i class="fas fa-map-marker"></i><span>USA - 100 N Central Expressway 613, Richardson, TX 75080 . , 71000 United Arab Emirates</span> </li>\n
<li> <i class="fas fa-phone"></i><span dir="ltr">(+971 56 555 2200)</span> </li>\n
<li> <i class="fas fa-envelope"></i><span> <a href="mailto:sales@brandbychoice.com">emx.motorsme@gmail.com</a> </span> </li>\n
\n
</ul>\n
</div>\n
</div>\n
<div class="col-12 col-md-4">\n
<div class="footer-block">\n
<div class="single-footer single-footer-left">\n
<h5>Our Services</h5>\n
<div class="row">\n
<div class="col-7 col-md-8">\n
<hr>\n
</div>\n
</div>\n
<ul class="links-list pl-0 mb-0">\n
<li> <a href="https://emxmotors.com"><i class="fa fa-angle-right"></i>Home</a> </li>\n
<li> <a href="https://emxmotors.com/shop"><i class="fa fa-angle-right"></i>Shop</a> </li>\n
<li> <a href="https://emxmotors.com/orders"><i class="fa fa-angle-right"></i>Orders</a> </li>\n
<li> <a href="https://emxmotors.com/viewcart"><i class="fa fa-angle-right"></i>Shopping Cart</a> </li>\n
<li> <a href="https://emxmotors.com/wishlist"><i class="fa fa-angle-right"></i>Wishlist</a> </li>\n
</ul>\n
</div>\n
</div>\n
</div>\n
<div class="col-12 col-md-4 ">\n
<div class="single-footer single-footer-right">\n
<h5>Information</h5>\n
<div class="row">\n
<div class="col-7 col-md-8">\n
<hr>\n
</div>\n
</div>\n
<ul class="links-list pl-0 mb-0">\n
<li> <a href="https://emxmotors.com/page?name=privacy-policy"><i class="fa fa-angle-right"></i>Privacy Policy</a> </li>\n
<li> <a href="https://emxmotors.com/page?name=term-services"><i class="fa fa-angle-right"></i>Terms of Services</a> </li>\n
<li> <a href="https://emxmotors.com/contact"><i class="fa fa-angle-right"></i>Contact Us</a> </li>\n
</ul>\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
<div class="container-fluid p-0">\n
<div class="copyright-content">\n
<div class="container">\n
<div class="row align-items-center">\n
\n
<div class="col-12 col-md-6">\n
<div class="footer-info">\n
© 2024 Company, Inc. <a href="https://emxmotors.com/page?name=refund-policy">Privacy</a> • <a href="https://emxmotors.com/page?name=term-services">Terms</a>\n
\n
\n
</div>\n
\n
</div>\n
<div class="col-12 col-md-6">\n
<div class="footer-image">\n
<img class="img-fluid" src="https://emxmotors.com/web/images/miscellaneous/payments.png">\n
</div>\n
\n
</div>\n
</div>\n
</div>\n
</div>\n
</div>\n
\n
</footer>\n
"""
"cart" => 1
"blog" => 1
"detail" => 1
"slidercategorydetail" => 1
"shop" => 1
"contact" => 1
"login" => 1
"transitions" => 5
"product_section_order" => """
[{"id":11,\r\n
"name":"Tab Products View",\r\n
"order":1,\r\n
"file_name":"tab",\r\n
"status":0,\r\n
"image":"images\/prototypes\/tab.jpg",\r\n
"disabled_image":"images\/prototypes\/tab-cross.jpg",\r\n
"alt":"Tab Products View"},\r\n
{"id":5,\r\n
"name":"Categories",\r\n
"order":2,\r\n
"file_name":"categories",\r\n
"status":1,\r\n
"image":"images\/prototypes\/categories.jpg",\r\n
"disabled_image":"images\/prototypes\/categories-cross.jpg",\r\n
"alt":"Categories"},\r\n
{"id":8,\r\n
"name":"Newest Product Section",\r\n
"order":3,\r\n
"file_name":"newest_product",\r\n
"status":1,\r\n
"image":"images\/prototypes\/newest_product.jpg",\r\n
"disabled_image":"images\/prototypes\/newest_product-cross.jpg",\r\n
"alt":"Newest Product Section"},\r\n
{"id":10,\r\n
"name":"Second Ad Section",\r\n
"order":4,\r\n
"file_name":"sec_ad_banner",\r\n
"status":1,\r\n
"image":"images\/prototypes\/sec_ad_section.jpg",\r\n
"disabled_image":"images\/prototypes\/sec_ad_section-cross.jpg",\r\n
"alt":"Second Ad Section"},\r\n
{"id":13,\r\n
"name":"Newest Product Section",\r\n
"order":5,\r\n
"file_name":"my_file",\r\n
"status":1,\r\n
"image":"images\/prototypes\/newest_product.jpg",\r\n
"disabled_image":"images\/prototypes\/newest_product-cross.jpg",\r\n
"alt":"Newest Product Section"},\r\n
{"id":1,\r\n
"name":"Banner Section",\r\n
"order":6,\r\n
"file_name":"banner_section",\r\n
"status":1,\r\n
"image":"images\/prototypes\/banner_section.jpg",\r\n
"alt":"Banner Section"},\r\n
{"id":2,\r\n
"name":"Flash Sale Section",\r\n
"order":7,\r\n
"file_name":"flash_sale_section",\r\n
"status":0,\r\n
"image":"images\/prototypes\/flash_sale_section.jpg",\r\n
"disabled_image":"images\/prototypes\/flash_sale_section-cross.jpg",\r\n
"alt":"Flash Sale Section"},\r\n
{"id":9,\r\n
"name":"Top Selling",\r\n
"order":8,\r\n
"file_name":"top",\r\n
"status":0,\r\n
"image":"images\/prototypes\/top.jpg",\r\n
"disabled_image":"images\/prototypes\/top-cross.jpg",\r\n
"alt":"Top Selling"},\r\n
{"id":4,\r\n
"name":"Ad Section",\r\n
"order":9,\r\n
"file_name":"ad_banner_section",\r\n
"status":0,\r\n
"image":"images\/prototypes\/ad_banner_section.jpg",\r\n
"disabled_image":"images\/prototypes\/ad_banner_section-cross.jpg",\r\n
"alt":"Ad Section"},\r\n
{"id":3,\r\n
"name":"Special Products Section",\r\n
"order":10,\r\n
"file_name":"special",\r\n
"status":0,\r\n
"image":"images\/prototypes\/special_product.jpg",\r\n
"disabled_image":"images\/prototypes\/special_product-cross.jpg",\r\n
"alt":"Special Products Section"},\r\n
{"id":12,\r\n
"name":"Banner 2 Section",\r\n
"order":11,\r\n
"file_name":"banner_two_section",\r\n
"status":1,\r\n
"image":"images\/prototypes\/sec_ad_section.jpg",\r\n
"disabled_image":"images\/prototypes\/sec_ad_section-cross.jpg",\r\n
"alt":"Banner 2 Section"},\r\n
{"id":6,\r\n
"name":"Blog Section",\r\n
"order":12,\r\n
"file_name":"blog_section",\r\n
"status":0,\r\n
"image":"images\/prototypes\/blog_section.jpg",\r\n
"disabled_image":"images\/prototypes\/blog_section-cross.jpg",\r\n
"alt":"Blog Section"},\r\n
{"id":7,\r\n
"name":"Info Boxes",\r\n
"order":13,\r\n
"file_name":"info_boxes",\r\n
"status":1,\r\n
"image":"images\/prototypes\/info_boxes.jpg",\r\n
"disabled_image":"images\/prototypes\/info_boxes-cross.jpg",\r\n
"alt":"Info Boxes"}]
"""
]
"data" => null
"products_images" => Illuminate\Support\Collection {#1152}
]