1 2<!DOCTYPE html> 3<html lang=ar dir=rtl> 4<head> 5 6 <base href="https://brandfull.com" target="_top"> 7 <link rel="dns-prefetch" href="https://brandfull.com" /> 8 <link rel="preconnect" href="https://cdn.brandfull.com"> 9 <link rel="preconnect" href="https://cdn.brandfull.com" crossorigin> 10 <link rel="dns-prefetch" href="https://cdn.brandfull.com"> 11 <link rel="preconnect" href="https://brandfullsapi.azurewebsites.net" crossorigin> 12 13 14 15 16 <title>ØµÙØØ© Ø§ÙØ¯Ø¹Ù - Ø¨Ø±Ø§ÙØ¯ÙÙ</title> 17 <meta charset="utf-8"> 18 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 19 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 20 <meta http-equiv="content-language" content="ar"> 21 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=5, shrink-to-fit=no" /> 22 23 <meta name="robots" content="index,follow"> 24 <meta name="googlebot" content="index,follow"> 25 26 <!-- Loading JS & CSS --> 27
27<script>!function(){var o=EventTarget.prototype.addEventListener;EventTarget.prototype.addEventListener=function(e,t,n){"touchstart"!==e&&"touchmove"!==e&&"wheel"!==e||("object"!=typeof n&&(n={capture:!!n}),n.passive=!0),o.call(this,e,t,n)}}();</script>
27 28 29 <link rel="stylesheet" href="/site-Ar.min.css?v=639260136226636726"> 30<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Light.woff2" as="font" fetchpriority="low" crossorigin="anonymous"> 31<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Regular.woff2" as="font" crossorigin="anonymous"> 32<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Bold.woff2" as="font" crossorigin="anonymous"> 33<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/Assets/fonts/cartzilla-icons-sub.woff2?v=1" as="font" fetchpriority="low" crossorigin="anonymous"> 34<style> 35 36 37@font-face { 38 font-family: 'IBMPlexSansArabic'; 39 font-style: normal; 40 font-weight: 300; 41 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Light.woff2) format('woff2'); 42 font-display: swap; 43} 44 45@font-face { 46 font-family: 'IBMPlexSansArabic'; 47 font-style: normal; 48 font-weight: 400; 49 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Regular.woff2) format('woff2'); 50 font-display: swap; 51} 52 53@font-face { 54 font-family: 'IBMPlexSansArabic'; 55 font-style: normal; 56 font-weight: 700; 57 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Bold.woff2) format('woff2'); 58 font-display: swap; 59} 60 61 62 63@font-face { 64 font-family: "cartzilla-icons"; 65 src: url(https://cdn.brandfull.com/Themes/Cartzilla/Assets/fonts/cartzilla-icons.woff2?v=6) format("woff2"); 66 font-weight: normal; 67 font-style: normal; 68 font-display: block; 69} 70 71@font-face { 72 font-family: "cartzilla-icons"; 73 src: url(https://cdn.brandfull.com/Themes/Cartzilla/Assets/fonts/cartzilla-icons-sub.woff2?v=1) format("woff2"); 74 font-weight: normal; 75 font-style: normal; 76 font-display: block; 77 unicode-range: U+E902,U+E903,U+E904,U+E906,U+E908,U+E90A,U+E90C,U+E90F,U+E910,U+E912,U+E914,U+E916,U+E918,U+E919,U+E91A,U+E91B,U+E91C,U+E91D,U+E91F,U+E920,U+E921,U+E922,U+E923,U+E926,U+E928,U+E929,U+E92C,U+E92D,U+E92F,U+E933,U+E937,U+E938,U+E939,U+E93B,U+E93F,U+E940,U+E944,U+E945,U+E946,U+E947,U+E948,U+E94A,U+E94C,U+E94D,U+E952,U+E953,U+E954,U+E956,U+E957,U+E959,U+E95A,U+E95D,U+E95E,U+E963,U+E964,U+E965,U+E969,U+E96A,U+E96B,U+E96E,U+E970,U+E972,U+E974,U+E97A,U+E97F,U+E980,U+E982,U+E983,U+E985,U+E986,U+E987,U+E98A,U+E98B,U+E98C,U+E98D,U+E98F,U+E991,U+E994,U+E99C,U+E99F,U+E9A6,U+E9AA,U+E9AB,U+E9AE,U+E9BE,U+E9BF,U+E9C1,U+E9C3,U+E9D5,U+E9DA,U+E9DB,U+E9DD,U+E9DF,U+E9E0,U+E9E1,U+E9E2,U+E9E4,U+E9E5,U+E9E6; 78} 79 80@font-face { 81 font-family: "cartzilla-icons"; 82 src: url(data:font/woff2;base64,d09GMgABAAAAAA7YAAsAAAAAGQgAAA6KAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgSwRCAqrNKQCATYCJAMqCyoABCAFgRAHIBtpFFGUj1YN4OeB7ciNNa7Y8fpdT0YrmhkhyewP/DZ7RArzW19BPiIWKRysgsgd2Fg4XamThTfcias2cNHWospcpXKtXhXOla7VgRS7q740EAw4G0GKDdbZ/6T4SJ7ouzB4UtsP3qDJNbkOuvJgpbZrtQ0sksuddi/x4SkFJVSlAv9vLbW7QVL3ogAtCZeoxKGOsHHzJ7fvzb9N2oXQXBiP567MLqogbIWaKwEJ1TpUFbqKhDI1QtTWqM2CptBZ8p65IUZqZQyYtPES+69e0lsAAuEzbhOQAPA1+McAsFE/PtwzUOJo0GpDQFR5id6/CW2+toMEhuzOOA+dV1S8SsBgT8fp2UTYxfnAo18T3kv0Ur2IN9Ab5uV5VV6DN9vr9C7yrvJWe/d4u71/+3wUv3p13qy/MT2EfkL70T70Ofoveg+9jZ5H69BtaDW6GnWio1AZ4OACKMT5fLRjg1WBMjmJsruLpvl0uPXyRMABBUhAzqYBHgk3kg4SgQRWCB4YNowRGqzPLplE1DNRKo3DjCbSGFIOQqPR6f6I/6hYTigWEBoYTg7zHzYsSMi47iWax2TM/SLTb5gfh6OURccIdNJIZOPP/E1UxlaeQuM8D1FDyjIAYF0I+w+i2gBbbET9bMUoAb4nHnU+eYSIlga3Ged5CSd4s6lxscYYyZTu4RD5JfG5AWJizYBfoPVwYCzw6o7Mb/gZ0R0ieW3LVNoaw8W6oapkmwPkElIHJQAV+2u4swKUZKRr6bAd762SfrkX7LZH87Ihdq/3zZpXa1+8XgfW/+3sKBW+WoBFK1gKVf99tWJAmAObqF+IjDCyr5pZ0pvqm60lGYHMEuVf7uHlvpOuCzc0iObsZa2hH6ivnHomjdINwwq9O8uzHQruXVMnUXuxS9Zz6E+SjaF0f+ATHs6v7RjEuh/Jtf6VRLPidEu+mkH0Zq6YbgNVZ1oLtewLIoCloJwwTkHdaeRVjZ5UIcBDPOGZkAGqObOeDiOev+RfSIF3XRwZqzUUe0XDBYTR855arIkvSad7DcMSX6xyZVMzvFMJu0HQpo3ciyRJdHFGTcDaA7Ui1XqHP1xskGvJCKw7WCfTbS8j2co9CFflnpdRVL2vmiWar0WjmduD3FuzH74aSDGmsn1QXpRyvfwC1dC98mTLbfFoSeQ69d+Hz7ZJf91BxM61s8XC333XM/mOXoVp3kO5Ja0ytlkB+FlBXIsdpZWoPNtWrOeuUiro4YbFqL/ZPRkuh5sQIOxQECw/hRF2VfE0z6/4dZ/Gc4aU++JJKXpCMAATjMUujUie2Su9pNB9TQy9WGW0T3j6HbmSLaQq5/Pf21as9yF6OZNPVih2Na9UuuEnLPda865y01lxGqgFgZcGxshc7qHlvpv8vLUVlRFdPPtVb9tbhV2VZ4CR17ipsid/JxtJ4ItXHbUbRMQcDK6lw4jak+FS/QUCpMAT2eyNyb0WHDCVgO/X766+rnaJP3WnZddb5H7+KaeO8SoVQCIQxVL8uoZc6l9JlJ8IfqVoCdr25ocZq+nVXDFd1XdXe1oLtV4Ivpge
82kwA4FNS/6q90/bviOl+naXEtnhVsHjuwJyt5psaf5hkn+7GWGdb7wxe75HwexcQ1nmtnkxlI7s2JXCfAGD8SRvhXkSsFR2h/V4/QKdVbQxzTAxLBGMecRs3+cateHjFVUD0zetxKSxr+M8guUZt+I5pP4y1jJ+0GVarQYQC3yRyvYIQ4dsItM/TBH0CBj0Weqs88VlBg6xWxJ/rzQLggQFUy/sx4GsoyQEoPjz7XnvjciZS/88UFxgRDwhojjDLBaCo0nWF02xBM3cyhGZPpCsygs4ixQOlM2ApjviVy2e72hXPyZjoRe4jRb5AMBWy4aiiJw5yBZX2SEmK9mgMMwZEMUlL0Zk7mu07ehU5Ry97AtX6WaVec7+DVzHt63B91cnS4fCTi1UdPBGMu/l6sajweJhxPWr7CFD1h1r97XVVARbqhdgJJLnWHh8YgGhfTpd6/V5EsrQC672z1nKbF49JOQX5GjmCJr6sEv0jLZ1MtS1qmMm2lvR869bXEDB66kRWjKRiN07z74vPs7ADVqt2TZD7jO0BE7Yhq7Oh8IV3icg+vZo77p1u4s0L57yXxtSO0Y0mr2TArGJ6rBWN72DVuSIaDsmgrdZgQJvVyrhHClb29JF/NXG/oUXRh07RsL6uC4+j3CGAZD6lnRH1h8e/TVpttm0pzxJvhNWQuFrQijl3juiKB3R6L0nJZDHOJAwDlYQRereYb7YwFc0xmIl47RQUwZpYou0GsTbLrlSEOFdunSOo1YFUqsSSaJzpi3Bw5cTmCykqBazocIcuZmDN3cdh2hrqMfOCKPTHyNl0ucSfa7ZXEFN0ru82D8Q+Sj6RbA7HJCJ/v3xk6v2GyGOhQPOY/Nv4AcKv11qke/IcHvAMD2RE3U8fM4X4XhMA/GAEoYabhBF2MNMlYwFjN8N1d9niK8GmRIp35s7Ocs8tfVoG5LxxLN4C+XZxyI+wRETYbc3OysIJHgOTW0+jSpcsglse2seUFsHgRuvCMnyoLfNxZErssW5+Wrp33q/n41p935DpgTNIZvuf3CGtLe+4E1do9WQYfTIixGvlyo2ESEKF1tnCLaLkq92kL1/K7Ryc0ptssLA/ysf5p4iQrboqll6+HeqrEEzrHVmMqOvZd0Pd5N7sZzO6bxTcV00fTw82pqSnysQHz31rfruc8FocPUqV29oyG1SyWgb//5tYti51weIer4C4A+BbLN2/+lcWSy1ns37ZslmfUX1iEtvZiy35ZpTY3V3utjR0njI49z4NQ/u8bTQ5qCObCWFgh5vNSDGK1hE6eK16FXBdW9OlKwJPjRqe4PbDciQQvNtWiBoOlteFQq6DJJ2hXr/rDp48/3tuDtHH60D3bNHawXYwZpw/XxfwQOi0kf1A8+NYo8AhN5MuOqyzfOzspHbiiOLtZUd73/xZxln/3C+//KJn1eWiB0f/OpSwHW8NWE8z/lBTvDzp4QZj34H70Lht2+LIws7098Z9p05uSX7+W5bz/f+7hJQ00tmz6Dz/ENa3fPvPJz4LCK1dGN+D1G8NUtlk7tn++06D79rZoevdDrdq/ZJVtRvMpig5Z/nXvQPy0b7/T7ycZ21uyZ948D5JvlZ5Nm3oFYTICnsBuXuvT6LT6be6DBwEuHdrm1ug0+qHtzWx/Gu3XVVteEfGEsN/aT6zf6fvFWXeivT3ULJoxUjNuoGBkbFKlWaDZQ6rla167l1SsUY/TjJNGjY7CVOPU48vX1tf7R+hJO4vFmipzEgDE78an7MJppxMALM3NOQYtEUktu21mmdm1RNwfcxuLFOcllZPeisVvSeVJeWLknI0dSaM2SZzOu93d9q7u2xAxyelLakh6qjKnDvupQ+YpxqCllmyulZktMJHPvlw6SSlzXt4MY+yujUgZp+xmD1bIK8MWc5AHDwb6ZZ5qT667sanHg7kwAKjmqOf19DTpG12XXTqI79gf1BhkNOkdy+uS3utBwQTEgnFo4EifSFD0W8empIwt+S2daHBXhyADU7S5072eksl2p97fGuQUpnTQGetq1i+uriavJ2srMQsMN6ImOr35qXv8kWQG8d0XbB1AEjONkMhIhq5//3nBTRgOOBiR4Bh6auXyA5BA5stfajzxIG88g882HVfL3cIwBRoDer3eGl5NY+So8+GmMy25eZ8GTKZnn/ykljOQy8odeGYMDACgQ2QfY503z3pvKZNrNPJnUuVD8+o2Pooax58+nT9OAQBw5+e3bKwUq2YdxtA7j+8wFPVeAJDlKaPTwf1YAmV2EqdwS2NpLqD74B3y9toH4I8/cFqLEAU5T/JQrBA3zHJgHms6V1/smjbN9U7PLrJWW2167jsovzhcv84MHTUoeUfWchjJV3EN8hXt/UtGGviGJSN8t86tNHDzTWkjx0/IyJhgRYKZXETNZHMnaJSGycQ3o7ljHBIsKvkTuCF2OS0xeezb+32YTlQmEpr7UvGG7+k7ZY/SZZJT0q1pY8fJTSn5q1li3mPe+CkT/zCNo2K205iv6OLTxqS1W4osbT7XBD6t8srlSUkh6MSJKGli0uUrI0bkiO8iSXLIJLmCEePx1F87Gh9/7Gr9ccUgSVePJR+99pzpfX0zJLKRt4AIB1I1VWRUUiBCSVXa1EP9ZJlkxnn8tauzdGKNSFOCpCMXLZuv1yNWF+muXYMxQW1dErVa2oXYECUuz0c6eSYWKUB+bcZOQGh1St2okhUrUYmXO3NLXbt4NRVGdvmyMoQfyxQSDArmNbyKigcAlJbmvvz8gtJh5AWxtq7OHhNGU86yx2XHllfE5cTaHVreMoGJyjDlLOGqwGF/eEVFrHtPDmTPppiso0er/4exDu4gpUEkrPmqL2L+hEye5ebznRZcW6bItf5LblzsL79Md3K/LHOJcBmRFtjO+Q6ffM+4Lbqo6as68rNuxqRv2rqqXnbfkFlUFusmj4gVExThhhmrPBQyk0wJLa8BuVxmjQl897aqeNmbLPuF/E19in0FtgBizN3VsKXrOF+AGY7XGLgCgYF7rJZrEPBPUL/XBQy3UIo5ifwAYjg7nBjAT+QUU6fodN9TU3R+L/yMmZKykC5WKh1LpqfqdNu7WqiL40csUCqNEdwMpXJmBD/eLtmbH/i0sbE3kB3Y23ji18D8fdK7VCTUh4b6QhHWD5I46fcfNftlKHoRGkxqfQUAvrYok9BW4vtzrhBud8XgiH22EdbxpyQMbs5nL7rGaFJf0xhUt7pxAHfJfu4/zXn+499S/R7aJv+xkY264Rt83yra/+cHVMADjCJA3yKADuU9ZDdzaR4cERCHxWCcCVBk84cvGRKAALi/pXC1fjEehgF3Z4JtZ6IUkwAFiU4W+QyYBk5YAIugCObckEFpdLEZUAzzoARSIB8K4evCnZBO6Hz0Io/vnAdfQDzIgQAXAAA=) format("woff2"); 83 font-weight: normal; 84 font-style: normal; 85 font-display: block; 86 unicode-range: U+E904,U+E908,U+E910,U+E912,U+E918,U+E920,U+E940,U+E944,U+E945,U+E946,U+E959,U+E95A,U+E972,U+E97A,U+E982,U+E98D,U+E99F,U+E9DB,U+E9E4; 87} 88 89 90 91@font-face { 92 font-family: "digital"; 93 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/digital-7.woff2) format('woff2'); 94 font-weight: normal; 95 font-style: normal; 96 font-display: swap; 97}</style> 98 <link rel="preload" href="https://cdn.brandfull.com/script.min.js?v=639260136226636726" as="script" fetchpriority="high"> 99 100 <link rel="preload" href="https://cdn.brandfull.com/InitData.ar.js?v=639260136446764345" as="script"> 101 <style> 102 .cart-drawer{position:fixed;top:0;right:0;width:380px;max-width:92vw;
102height:100vh;transform:translateX(var(--cart-hide-tx,100%));visibility:hidden} 103 [dir="rtl"] .cart-drawer{right:auto;left:0} 104 [dir="rtl"]{--cart-hide-tx:-100%} 105 .filter-drawer{position:fixed;top:0;left:0;width:340px;max-width:88vw;transform:translateX(var(--filter-hide-tx,-100%));visibility:hidden} 106 [dir="rtl"] .filter-drawer{left:auto;right:0} 107 [dir="rtl"]{--filter-hide-tx:100%} 108 .modal{display:none} 109 .seo-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0} 110 </style> 111 <!-- ios support --> 112 <meta name="mobile-web-app-capable" content="yes" /> 113 <meta name="apple-mobile-web-app-capable" content="yes" /> 114 <meta name="application-name" content="PWA Workshop" /> 115 <meta name="apple-mobile-web-app-title" content="PWA Workshop" /> 116 <meta name="msapplication-starturl" content="/" /> 117 <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.brandfull.com/Media/BrandFull/apple-touch-icon.png?version=639260136446764345"> 118 <meta name="apple-mobile-web-app-status-bar" content="#34200C" /> 119 <meta name="msapplication-TileColor" content="#34200C" /> 120 <meta name="theme-color" content="#34200C" /> 121 122 <!-- Favicon Icon --> 123 <link rel="icon" type="image/x-icon" href="https://cdn.brandfull.com/Media/BrandFull/favicon.png?version=639260136446764345" /> 124 <link rel="icon" type="image/png" sizes="32x32" href="https://cdn.brandfull.com/Media/BrandFull/favicon-32x32.png?version=639260136446764345"> 125 <link rel="mask-icon" href="https://cdn.brandfull.com/Media/BrandFull/safari-pinned-tab.svg?version=639260136446764345" color="#5bbad5"> 126 <link rel="shortcut icon" href="https://cdn.brandfull.com/Media/BrandFull/safari-pinned-tab.svg?version=639260136446764345" color="#5bbad5"> 127 128 <!--====== Required meta tags ======--> 129 130 <meta name="robots" content="noindex, nofollow"> 131 132 133 134 135
136<script type="application/javascript"> 137 var m_loadIndex = 0; 138 var m_listScript = []; 139 140 // GTM's snippet used to create this at head-parse time; it is deferred now (see the 141 // <template id="UI_headScript"> injector at the bottom of this file), and 142 // Tools/Deferred/ThirdParty.js -- the only other place that declares the name -- is fetched 143 // on idle. Anything touching bare `dataLayer` before either arrives throws a ReferenceError, 144 // and a Portal-authored blob does exactly that from inside a doLoadScript callback, which 145 // fires long before both. Seed the array here: GTM's own `w[l] = w[l] || []` adopts THIS 146 // array, so events pushed before gtm.js loads are still replayed rather than lost. 147 // Safe against every later writer -- `var dataLayer;` in ThirdParty.js keeps the existing 148 // value (a var redeclaration of a live global does not reset it), and doSetThirdParty only 149 // assigns when its argument is non-null. 150 window.dataLayer = window.dataLayer || []; 151 152 // On the CDN with every other script the app loads -- scriptPage.min.js, scriptGallery.min.js, 153 // Handlers/Pages/*.js, Tools/Deferred/ThirdParty.js. /InitData.js is the single exception and 154 // has to stay: it is generated per language and company by our own HostController. 155 // 156 // It MUST stay in step with the <link rel=preload as=script> in both themes' _Layout: 157 // doGetVersionedUrl appends the same ?v= the preload carries, so the two URLs match byte for 158 // byte and the preloaded bytes are the ones that run. Point one at the CDN and the other at this 159 // origin and the bundle is simply downloaded twice. Neither carries crossorigin, so both are 160 // no-cors fetches and the preload is reused -- adding it to one alone would split them again. 161 // 162 // m_CDNUrl is empty on any build that serves its own assets, so this is "/script.min.js" 163 // unchanged in local dev, and doCheckOwnAsset answers true either way (leading '/', or the 164 // m_cdnBase prefix), which is what keeps the ?v= and the async-and-first placement. 165 var defaultScript = "https://cdn.brandfull.com/script.min.js"; 166 var m_isEnumReady = false; 167 168 // The whole-site blobs -- the category tree, the company and country lists, the enum translation 169 // dictionary -- served as one cacheable file by HostController instead of being inlined into 170 // every HTML response (~280 KB of a 784 KB page, the category tree alone 270 KB of it). 171 // 172 // On the CDN like every other script, even though this one is an MVC route rather than a file -- 173 // so is scriptPage.min.js, which has always been served from there. The response is a pure 174 // function of (lang, v): HostController composes it from statics keyed on nothing else, and the 175 // action drops the Set-Cookie headers the middleware seeds, which is what a CDN refuses to cache 176 // against. 177 // 178 // The language is in the URL because a script element sends no custom headers, so the `lang` 179 // header the rest of the app rides on is not available to it - and it is a PATH segment rather 180 // than ?lang= so that a CDN cannot cache one language and serve it to every visitor. See 181 // SettingManager.doGetInitDataPath, which the preload in _Layout builds from too. 182 // 183 // ?v= is written here rather than left to doGetVersionedUrl, and it is m_version -- the API's 184 // data version -- because this file IS API data: the category tree, the company and country 185 // lists, the enum translations. An /AutoRefresh that changes them without a redeploy has to 186 // change this url, and the build token would not move. doGetVersionedUrl sees the v= and adds 187 // nothing, so this stays byte-identical to the preload in _Layout, which spells it the same way. 188 var m_initDataUrl = "https://cdn.brandfull.com/InitData.ar.js?v=639260136446764345"; 189 190 // Where the fold is, straight from the value doGenerateContentfull (called in _LayoutPreload) 191 // used to pick which div templates to inline and which image to preload. One number, one 192 // definition (SettingManager.m_foldHeight). The client no longer walks the fold to decide which 193 // sections reserve a height -- every un-hydrated section holds the same 320px floor -- but the 194 // value is still read by the div loader, so it stays emitted here. 195 var m_foldHeight = 700; 196 197 // event.persisted == restored from the back/forward cache: the whole page came back frozen from 198 // memory, so nothing re-ran and m_currentCart still holds whatever it held when the visitor left. 199 // This used to call document.location.reload(), which fixed the staleness by throwing away the 200 // free instant restore -- re-downloading script.min.js, re-binding every Knockout template and 201 // re-issuing the div-section calls, on every single back navigation. 202 // doInitDataPageCart() re-fetches just the cart (CartService.GetInitData) and repopulates 203 // m_currentCart, which is what the header badge, the drawer and the totals all read. Its default 204 // arguments (reloadPage = false, url = '') mean it never navigates or reloads. 205 window.addEventListener('pageshow', function(event) { 206 if (!event.persisted) 207 return; 208 // Guard: the handler is created in the doLoadScript callback below. A restore always implies a 209 // fully-initialised page, but a restore racing a failed script load would otherwise throw here. 210 if (typeof m_handlerSession == "object" && m_handlerSession != null) 211 m_handlerSession.doInitDataPageCart(); 212 });
213 214 function doLoadReady(url) { 215 var item = m_listScript.find(item => item._url == url); 216 if (item._isLoaded == false) 217 { 218 item._isLoaded = true; 219 doRunOnReady(url, true); 220 } 221 } 222 223 var m_cdnBase = "https://cdn.brandfull.com"; 224 225 // The BUILD's token (SettingManager.m_assetVersion), not the API's data version. It buys nothing 226 // here to spend a thought on which: the bundles this versions ship with the binary, and the one 227 // url that is API data -- /InitData.js -- carries its own ?v= already, which doGetVersionedUrl 228 // leaves alone. Read the comment on SettingManager.m_assetVersion for why the two were split: 229 // versioning script.min.js with a number the API owns meant a front-only deploy re-served the 230 // same immutable url, and visitors ran an old bundle behind new markup. 231 var m_assetVersion = "639260136226636726"; 232 233 // Free-shipping teaser sentences, whole rather than assembled from labels. The teaser used to be 234 // built in the view out of "You already have" + a number + "off your shipping" + ..., and the 235 // translation service sees each fragment alone: "off your shipping" came back as the imperative 236 // "Ø§ÙØ²Ù Ù Ù Ø´ØÙÙ" ("get off your shipment"), and the Arabic sentence read as nonsense. One label per 237 // sentence gives the translator the whole clause and lets it place the number itself, which RTL 238 // needs. Substitution is doGetShipmentTeaserMessage in Handler_Session. Json.Serialize, not bare 239 // quotes: these strings are machine-translated and may legitimately contain a quote. 240 var m_textShipmentTeaserSaved = "\u0644\u0642\u062F \u0648\u0641\u0631\u062A {0} {1} \u0645\u0646 \u062A\u0643\u0644\u0641\u0629 \u0627\u0644\u0634\u062D\u0646"; 241 var m_textShipmentTeaserDiscount = "\u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u062E\u0635\u0645 \u0634\u062D\u0646"; 242 var m_textShipmentTeaserTopUp = "\u0623\u0636\u0641 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 {0} {1} \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0634\u062D\u0646 \u0645\u062C\u0627\u0646\u064A"; 243 244 // Is this one of our own assets, as opposed to a third-party SDK? 245 // 246 // The old test was `url.indexOf('@SettingManager.m_CDNUrl') == -1`. m_CDNUrl is an empty 247 // string whenever the app serves its own assets (local dev, and any deployment without a 248 // separate CDN host) -- and "anything".indexOf("") is 0, never -1. Every URL therefore 249 // looked like ours, which mattered because the branches below both version the URL and 250 // choose defer-vs-async from this answer. 251 // A root-relative URL is same-origin by definition, and it is answered before the CDN test: 252 // /InitData.js is served by our own HostController, never by the CDN host, so with a CDN 253 // configured the old form called it third-party -- which skipped the ?v= cache-bust that is the 254 // only thing invalidating it across deploys. 255 function doCheckOwnAsset(url) { 256 if (url.charAt(0) === '/') 257 return true; 258 return m_cdnBase ? url.indexOf(m_cdnBase) === 0 : false; 259 } 260 261 // Cache-bust our own assets so a deploy is actually picked up, and never touch a 262 // third-party URL: several already carry a query string (Google Maps key/callback, 263 // MISPay authorize, Checkout.com), and a second "?" makes them malformed. 264 function doGetVersionedUrl(url) { 265 if (!doCheckOwnAsset(url)) 266 return url; 267 268 // Already versioned by the server -- /InitData.js, which is API data and so carries 269 // m_version rather than the build token. Appending a second v= here would both make it a 270 // different url from the <link rel=preload> in _Layout (two downloads of the same file) and 271 // hand the server two values for one parameter. 272 if (url.indexOf('?v=') !== -1 || url.indexOf('&v=') !== -1) 273 return url; 274 275 return url + (url.indexOf('?') === -1 ? '?' : '&') + 'v=' + m_assetVersion; 276 } 277 278 function doLoadScript(callBack, url = defaultScript, isModule = false) { 279 var item = m_listScript.find(item => item._url == url); 280 if (!item) { 281 item = { _isReady: false, _url: url, _callBack: [callBack], _isLoaded: false }; 282 m_listScript.push(item); 283 284 var script = document.createElement("script"); 285 if (typeof callBack == "function" && !isModule) 286 script.type = "application/javascript"; 287 else { 288 script.type = "module"; 289 script.innerText = (callBack + "").replace("URL", url); 290 } 291 script.src = doGetVersionedUrl(url); 292 293 //script.defer = true; 294 script.charset = "utf-8"; 295 script.addEventListener('load', function () { 296 doLoadReady(url); 297 }); 298 299 script.onerror = function () { 300 item._isError = true; 301 console.log("Error loading " + url); 302 // Never leave the queue standing behind a script that is not coming. doRunOnReady 303 // steps over errored items when it picks the head, but nothing else would wake it, 304 // and for /InitData.js this is also what releases doSetEnumManager's fallback. 305 doRunOnReady(url, true); 306 }; 307 308 try { 309 // Third-party SDKs are deferred and appended; ours are async and put first so 310 // they start downloading as early as possible. 311 if (!doCheckOwnAsset(url)) 312 { 313 script.defer = true; 314 document.head.appendChild(script); 315 } 316 else{ 317 script.async = true; 318 var head = document.getElementsByTagName("head")[0]; 319 head.insertBefore(script, head.firstChild); 320 } 321 } catch (error) { 322 //once load before 323 console.log(error); 324 setTimeout(doRunOnReady, 1000, url, true); 325 return false; 326 } 327 } 328 else if (item._isReady === true) { 329 // Synchronous, because the script this callback waited for has already loaded. That is
330 // exactly the state an ajax view swap runs in: doHtmlSetInner evaluates the swapped-in 331 // page's inline block, it calls doLoadScript for a bundle that is already _isReady, and 332 // the callback runs right here, inside that eval. doLoadViewAjax now compares 333 // X-Asset-Version against m_assetVersion and navigates instead of swapping, so a skew 334 // introduced by the RESPONSE no longer reaches this line -- see doRunCallBack below for 335 // what still does. 336 if (typeof callBack == "function") 337 doRunCallBack(callBack); 338 } 339 else { 340 item._callBack.push(callBack); 341 } 342 } 343 344 // Run one page callback, and treat a missing symbol as a bundle that cannot serve this markup. 345 // 346 // A ReferenceError out of a page's own callback -- "doFinishPaintEarly is not defined", 347 // "doSetHandlerPageScroller is not defined" -- is never a typo in the view: those calls sit INSIDE a 348 // doLoadScript callback, so the bundle demonstrably arrived. It means the bundle that arrived is 349 // an OLD build. A tab held open across a deploy keeps the script.min.js it loaded then, and an 350 // ajax swap pulls markup from the server as it is NOW; ?v= cannot repair that, because the swap 351 // never re-loads the bundle and the old one is already parsed. A stale or failed 352 // Handlers/Pages/*.js throws the identical error and is fixed by the identical answer. 353 // 354 // Second line of defence since doLoadViewAjax gained its X-Asset-Version check, which stops the 355 // skew before anything is swapped. What still lands here is what no response header can see: a 356 // stale or failed Handlers/Pages/*.js, a bundle the CDN served old under a current ?v=, and the 357 // one navigation per build doClaimBuildNavigation lets through so a mixed fleet cannot ping-pong. 358 // 359 // The answer is to stop and let the browser fetch the document properly: the new document carries 360 // a new m_assetVersion, and every ?v= in it then points at the matching build. 361 // 362 // Keyed on m_assetVersion so it cannot loop -- the flag records the build we already reloaded 363 // for, so a genuine bug in the current build reloads once and then stops. A storage failure 364 // (Safari private mode) means no flag can be kept, so it does not reload at all. 365 function doReloadOnceForBuild() { 366 try { 367 if (sessionStorage.getItem('bundleReload') == m_assetVersion) 368 return false; 369 sessionStorage.setItem('bundleReload', m_assetVersion); 370 } 371 catch (storageError) { return false; } 372 window.location.reload(); 373 return true; 374 } 375 376 function doRunCallBack(callBack) { 377 try { 378 callBack(); 379 } 380 catch (error) { 381 console.log(error); 382 if (!(error instanceof ReferenceError)) 383 return; 384 doReloadOnceForBuild(); 385 } 386 } 387 388 // /InitData.js carries the 111 enums, m_jsonTranslate and the three jsonList* blobs. It is 389 // fetched, not inlined, so it can fail -- and if it does, every one of those globals is missing 390 // and nothing on the page would ever run. Deliberately keyed on _isError and not on a timeout, 391 // so a slow file is waited for rather than given up on. 392 function doCheckInitDataFailed() { 393 var item = m_listScript.find(item => item._url == m_initDataUrl); 394 return item ? item._isError === true : false; 395 } 396 397 function doSetEnumManager(url) { 398 // TranslateEnum used to arrive with script.min.js and only m_jsonTranslate came from 399 // /InitData.js. The enums moved there too, so both tests now answer the same question -- 400 // "has /InitData.js landed" -- and are asked together. Neither says anything about the 401 // bundle any more; that is what the doApplyTranslations test further down is for. 402 // 403 // Not here yet -> "not yet". Gone for good -> RELOAD, once per build, on the same 404 // sessionStorage guard doRunCallBack uses. Standing empty objects up is no longer a 405 // degraded-but-working page the way it was when the enums were in the bundle: every page on 406 // the site has a binding that reads one, so an empty stand-in trades one failed request for 407 // a page of failed bindings. A reload is the only thing that can actually fix it, and the 408 // guard is what stops it looping. 409 // 410 // If the reload has already been spent on this build (or sessionStorage is unavailable, as 411 // in Safari private mode), fall through to the old behaviour: empty lists, keys for labels,
412 // no category menu. Worse than it was, but still a page. 413 if (typeof TranslateEnum != "object" || typeof m_jsonTranslate != "object") { 414 if (!doCheckInitDataFailed()) 415 return false; 416 if (doReloadOnceForBuild()) 417 return false; 418 419 if (typeof TranslateEnum == "undefined") TranslateEnum = {}; 420 if (typeof m_jsonTranslate != "object") m_jsonTranslate = {}; 421 if (typeof jsonListCategory == "undefined") jsonListCategory = []; 422 if (typeof jsonListCompany == "undefined") jsonListCompany = []; 423 if (typeof jsonListCountry == "undefined") jsonListCountry = []; 424 } 425 426 // Comes from _LayoutScriptTail at the foot of the document. Same "not yet" answer as the 427 // tests above: doRunOnReady waits on DOMContentLoaded, which is the instant it comes into 428 // being. 429 // 430 // Never write a literal body tag in a comment inside an inline script. doLoadViewAjax 431 // pulls a full-page ajax response apart by searching the TEXT for one, so a mention in 432 // the head matches 20 KB before the real element and the rest of this script gets 433 // written into the page as visible text. That shipped. Ajax.ts no longer scans for it, 434 // but the phrasing here stays deliberate. 435 // doApplyTranslations comes from script.min.js (Tools/Enums.ts). Nothing above tests for the 436 // bundle any more: TranslateEnum moved to /InitData.js with the other 110 enums, so the 437 // TranslateEnum test now proves /InitData.js landed and says nothing about the bundle. Without 438 // this, /InitData.js winning the race against the bundle threw 439 // "doApplyTranslations is not defined" out of the try below on every such load. 440 if (typeof doApplyTranslations != "function" || typeof doApplySettingByCompany != "function") 441 return false; 442 443 try { 444 doApplyTranslations(m_jsonTranslate); 445 doApplySettingByCompany(); 446 } catch (error) {console.log(error); return false;} 447 448 m_isEnumReady = true; 449 return true; 450 } 451 452 453 // Nothing may run before the document has finished parsing, and the two things that gate a 454 // callback resolve on their own events: doApplySettingByCompany appears when the parser reaches 455 // _LayoutScriptTail, and TranslateEnum / m_jsonTranslate appear when script.min.js and 456 // /InitData.js load. So this is entirely event-driven -- there is no timer left in it. 457 // 458 // It used to be setTimeout(..., sleepTime) with sleepTime += 50 on every miss -- 50, 100, 150, 459 // 200 -- and the escalated value was then carried into the readyState test and into the 460 // queue-order test, where scriptPage.min.js polled behind script.min.js on its own growing timer. 461 // Dead latency sitting in front of doSetSetting, i.e. in front of the page's bind, and the page 462 // gate charges every millisecond of it to LCP. 463 // 464 // The `url` argument is now only a hint about WHY we were woken. What actually runs is decided by 465 // walking the queue from its head, which is what makes the ordering safe no matter which script 466 // wins the race: whoever arrives last finds everything before it already loaded and drains the 467 // lot. Draining only `url` would deadlock -- the head could be ready with nobody left to notice. 468 function doRunOnReady(url, byscript = false) { 469 if (document.readyState === "loading") { 470 document.addEventListener('DOMContentLoaded', function () { doRunOnReady(url, byscript); }, { once: true }); 471 return ; 472 } 473 474 // Still missing a dependency. Do NOT schedule a retry: every one of them arrives on a load 475 // event that calls straight back in here. 476 if(m_isEnumReady == false && !doSetEnumManager(url)) 477 return ; 478 479 try { 480 //console.log("ByScript " + byscript + ", " + url + " "+document.readyState) 481 for (;;) { 482 // The head of the queue: the first script still owing its callbacks. One that failed 483 // to load is stepped over rather than left at the head -- it is never becoming ready, 484 // and leaving it there would wedge everything behind it. 485 var item = m_listScript.find(x => x._isReady == false && x._isError != true); 486 487 // Nothing waiting, or the head has not arrived yet -- and callbacks run in request 488 // order, so anything behind it waits for its load event. 489 if (!item || item._isLoaded != true) 490 return ; 491 492 while (item._callBack.length != 0) { 493 var callBack = item._callBack.shift(); 494 // Detached by setTimeout, so the try around this loop never sees what the 495 // callback throws -- doRunCallBack is the only thing that can. 496 if (typeof callBack == "function") 497 setTimeout(doRunCallBack, 0, callBack); 498 } 499 500 item._isReady = true; 501 //console.log("ByScript " + item._url + " is passed") 502 } 503 }catch (error) { 504 console.log(error); 505 } 506 } 507 508</script>
508 509 510
510<script> 511 function doGetBrowserName() { 512 var nAgt = navigator.userAgent; 513 var browserName = navigator.appName; 514 var nameOffset, verOffset; 515 516 if ((verOffset = nAgt.indexOf("OPR/")) != -1) 517 browserName = "Opera"; 518 else if ((verOffset = nAgt.indexOf("Opera")) != -1) 519 browserName = "Opera"; 520 else if ((verOffset = nAgt.indexOf("MSIE")) != -1) 521 browserName = "Microsoft Internet Explorer"; 522 else if ((verOffset = nAgt.indexOf("Chrome")) != -1) 523 browserName = "Chrome"; 524 else if ((verOffset = nAgt.indexOf("Safari")) != -1) 525 browserName = "Safari"; 526 else if ((verOffset = nAgt.indexOf("Firefox")) != -1) 527 browserName = "Firefox"; 528 else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < 529 (verOffset = nAgt.lastIndexOf('/'))) { 530 browserName = nAgt.substring(nameOffset, verOffset); 531 if (browserName.toLowerCase() == browserName.toUpperCase()) 532 browserName = navigator.appName; 533 } 534 return browserName; 535 } 536 537 function doGetSystemInfo() { 538 var browserName = doGetBrowserName(); 539 var nav = navigator || {}; 540 var scr = (typeof screen != "undefined") ? screen : {}; 541 var data = decodeURI(window.location.href) + "#" + browserName + "#" + nav.platform + "#" 542 + "\nUA: " + nav.userAgent 543 + "\nViewport: " + window.innerWidth + "x" + window.innerHeight + " @" + (window.devicePixelRatio || 1) + "x" 544 + "\nScreen: " + (scr.width || "?") + "x" + (scr.height || "?") 545 + "\nLang: " + (nav.language || "?") + " | Online: " + nav.onLine + " | Mem: " + (nav.deviceMemory ? nav.deviceMemory + "GB" : "?") 546 + "\nReferrer: " + document.referrer; 547 return data; 548 } 549 550 // Client-side dedupe. The hash identifies the *fault*, not the visit: page URLs, 551 // line/col and cache-busting query strings are deliberately left out, so the same 552 // error raised on 500 product pages collapses to one hash and is posted once. 553 // Kept in localStorage so it also survives reloads and in-app-browser page hops -- 554 // repeat visits from the same device stop re-posting a fault we already have. 555 var m_sentHash = {}; // this page load; still works when storage is blocked 556 var m_hashKey = "errHash", m_hashMax = 100; 557 558 function doGetStackSignature(stack) { 559 var lines = ("" + stack).split("\n"), out = [], i, m; 560 for (i = 0; i < lines.length && out.length < 5; i++) { // 5 frames: deep recursion collapses 561 m = lines[i].match(/^\s*at\s+([^\s(]+)/) // Chrome/Edge: " at doFoo (url:1:2)" 562 || lines[i].match(/^\s*([^\s@]+)@/); // Safari/Firefox: "doFoo@url:1:2" 563 if (m && m[1]) 564 out.push(m[1]); 565 } 566 return out.join(">"); 567 } 568 569 function doGetHash(text) { 570 var h = 0x811c9dc5; // FNV-1a, 32-bit 571 for (var i = 0; i < text.length; i++) { 572 h ^= text.charCodeAt(i); 573 h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0; 574 } 575 return h.toString(36); 576 } 577 578 // true = already reported, skip. Marks as seen on first call. 579 function doCheckSentBefore(hash) { 580 if (m_sentHash[hash] === true) 581 return true; 582 m_sentHash[hash] = true; 583 var list = []; 584 try { list = (localStorage.getItem(m_hashKey) || "").split(","); } catch (e) { } 585 if (list.indexOf(hash) != -1) 586 return true; 587 list.push(hash); 588 if (list.length > m_hashMax) // bounded ring, oldest hashes fall off 589 list = list.slice(list.length - m_hashMax); 590 try { localStorage.setItem(m_hashKey, list.join(",")); } catch (e) { } 591 return false; 592 } 593 594 function doReportError(kind, message, source, lineno, colno, error) { 595 var msgStr = (message == null) ? "" : ("" + message); 596 if (msgStr == "Script error." || msgStr.indexOf("_AutofillCallbackHandler") != -1) 597 return; 598 // Third-party noise, not our code -> ignore. Six families: 599 // 1. In-app browsers (Meta/IG/FB/Snapchat) inject native bridges that throw in non-native webviews. 600 // 2. Android/iOS WebView bridge objects get torn down on navigation ("Java object is gone"). 601 // 3. Injected analytics (GTM Custom HTML tags) throw from their own host, not ours. 602 // 4. Browser reader-mode shims (Brave/Firefox iOS inject window.__firefox__) throw before .reader exists. 603 // 5. MS Office/Outlook link-handler bridge rejects on a torn-down object id, on pages opened from email. 604 // 6. TikTok/Bytedance webview (musical_ly UA, FalconTag) injects its own script that handshakes 605 // with a parent iframe bridge that doesn't exist in the ad-preview dialog. 606 var stackStr = (error && error.stack) ? ("" + error.stack) : ""; 607 var noise = [ 608 "window.webkit.messageHandlers", // iOS webkit bridge (Meta/IG/FB) 609 "WebJSBridge", // Snapchat bridge 610 "sendDataToNative",
611 "sendPageShowMessage", 612 "Java object is gone", // Android WebView bridge torn down (IG keyboard/nav loggers) 613 "googletagmanager.com", // GTM Custom HTML tags 614 "__firefox__", // Brave/Firefox iOS reader-mode injection 615 "Object Not Found Matching Id:", // MS Office/Outlook bridge, e.g. "...Id:6, MethodName:update, ParamCount:4" 616 "iframeBridge", // TikTok FalconTag handshake into a parent bridge that isn't there 617 "user-script:" // frames from webview-injected scripts (TikTok/Bytedance); ours are https:// URLs 618 ]; 619 var haystack = msgStr + "\n" + stackStr + "\n" + (source == null ? "" : source); 620 for (var i = 0; i < noise.length; i++) 621 if (haystack.indexOf(noise[i]) != -1) 622 return; 623 // In-app browsers run injected scripts under a private "<name>js://" URL scheme 624 // (iabjs:// = Instagram). Our own code only ever runs from http(s):// -> any *js:// frame is theirs. 625 if (/[a-z0-9_]+js:\/\//i.test(stackStr)) 626 return; 627 // ServiceWorker registration failing to *fetch the script* (AbortError) = in-app browsers / 628 // blocked-storage contexts that can't install a SW. Benign, non-actionable. Deliberately narrow: 629 // real breakage (bad HTTP 404, SecurityError, parse error) has a different message and still logs. 630 if (msgStr.indexOf("Failed to register a ServiceWorker") != -1 && msgStr.indexOf("fetching the script") != -1) 631 return; 632 // Benign network/fetch-abort promise rejections (flaky mobile networks, in-app browsers, 633 // navigation aborting an in-flight request, blocked third-party trackers). No stack, not 634 // actionable. Scoped to promise rejections so real TypeErrors in our code still log. 635 if (kind == "promise" && (msgStr == "Load failed" 636 || msgStr.indexOf("Failed to fetch") != -1 637 || msgStr.indexOf("NetworkError") != -1 638 || msgStr.indexOf("network connection was lost") != -1 639 || msgStr.indexOf("cancelled") != -1 640 || msgStr.indexOf("appears to be offline") != -1)) 641 return; 642 // Benign browser notice, not an exception: an observer callback resized things again, so the 643 // browser deferred the remaining notifications to the next frame. Comes from third-party 644 // swiper/animation code, has no stack, and nothing breaks. Both wordings ("loop limit exceeded" 645 // = Chrome, "loop completed with undelivered notifications" = Safari/Chrome) are the same event. 646 if (msgStr.indexOf("ResizeObserver loop") != -1) 647 return; 648 var parameters = {}; 649 try { 650 var name = (error && error.name) ? error.name : ""; 651 var realMsg = (error && error.message) ? error.message : msgStr; 652 var stack = (error && error.stack) ? error.stack : "(no stack available)"; 653 parameters["_exceptionMessage"] = "[" + kind + "] " + (name ? name + ": " : "") + realMsg; 654 parameters["_methodName"] = source + " -- Row N° " + lineno + " Col N° " + colno; 655 parameters["_exception"] = doGetSystemInfo() + "\n\n" + stack; 656 657 658 if (typeof doSendAjax == "function") { 659 var hash = doGetHash(kind + "|" + name + "|" + realMsg + "|" + doGetStackSignature(stack)); 660 if (!doCheckSentBefore(hash)) 661 doSendAjax(RequestCode.SystemService.SaveExceptionJS, ko.toJSON(parameters), null, null); 662 } 663 } 664 catch (e) { console.log(e); } 665 } 666 667 window.onerror = function doErrorHandler(message, source, lineno, colno, error) { 668 doReportError("onerror", message, source, lineno, colno, error); 669 return true; 670 }; 671 672 window.addEventListener('unhandledrejection', function (e) { 673 var reason = e ? e.reason : null; 674 var msg = (reason && reason.message) ? reason.message : ("" + reason); 675 doReportError("promise", msg, 676 (reason && reason.fileName) || "", 677 (reason && reason.lineNumber) || 0, 678 (reason && reason.columnNumber) || 0, 679 reason); 680 }); 681 </script>
vendor: 2 bytes, line 681
681
682<script type="application/javascript"> 683 m_isCrawlByBot = 'True' == 'True'; 684 685 window.addEventListener('resize', function() 686 { 687 if(typeof m_handlerLayout != "object" || m_handlerLayout == null) 688 return; 689 690 if(typeof m_handlerLayout.m_isViewMobile == "function") 691 m_handlerLayout.m_isViewMobile('False' == 'True' || window.innerWidth < 768); 692 693 if(typeof m_handlerLayout.m_isMenuMobile == "function") 694 m_handlerLayout.m_isMenuMobile(window.innerWidth < 992); 695 }); 696 697 698 window.doOpenCropper = function (handler, folder, item) {} 699 700 // Requested FIRST, so it sits at the head of m_listScript and no page callback can run before its 701 // globals exist -- doSetEnumManager reads m_jsonTranslate, and the callback below reads all three 702 // jsonList* blobs. It carries no callback of its own; being in the queue is the whole point. 703 // It is a parallel fetch, not a serial one: it goes out alongside script.min.js, and the bundle is 704 // the bigger of the two. 705 doLoadScript(function () { }, m_initDataUrl); 706 707 doLoadScript(function () { 708 m_version = '639260136446764345'; 709 doSetSetting('https://brandfullsapi.azurewebsites.net', 'ar', 'sa', 'https://cdn.brandfull.com', 'BrandFull', "", "{\u0022_bundleSelectPercentage\u0022:40,\u0022_addCartQuantityLimit\u0022:\u0022100\u0022,\u0022_showObjectHtml\u0022:true,\u0022_showObjectExtras\u0022:true,\u0022_showObjectIsReturnable\u0022:true,\u0022_showObjectCounter\u0022:true,\u0022_showObjectDeliveryTime\u0022:false,\u0022_returnPolicyDays\u0022:\u00227\u0022,\u0022_returnPolicyFees\u0022:0,\u0022_returnPolicyMethod\u0022:0,\u0022_returnPolicyRefundType\u0022:0,\u0022_returnPolicyCountry\u0022:\u0022SA\u0022,\u0022_isBarCodeOptional\u0022:true,\u0022_allowPriceSaleAbovePriceRegulare\u0022:true}"); 710 711 712 if (doGetParamFromURL('Cookies') == "delete") 713 { 714 doSetCookie('cart', null, 1); 715 doGetSessionID(); 716 717 doRemoveURLParam("Cookies"); 718 } 719 720 m_handlerSession = new Handler_Session(); 721 m_handlerSession.doInitData(jsonListCompany, jsonListCountry); 722 doSetHandlerSession(m_handlerSession); 723 m_handlerLayout = new Handler_Layout(); 724 m_handlerLayout.m_isViewMobile('False' == 'True' || window.innerWidth < 768); 725 m_handlerLayout.doInitData(jsonListCategory); 726 m_handlerLayout.m_currentCategoryShortName(''); 727 m_handlerLayout.m_search(""); 728 doSetHandlerLayout(m_handlerLayout); 729 730 731 }); 732 733 // scriptPage.min.js -- bootstrap.bundle plus the Google-Maps position helper -- is NOT requested 734 // here any more. It was, on every page, with the empty callback this comment replaced: nothing 735 // waited on it, so 82 KB was parsed and compiled on the main thread ahead of the page's bind for 736 // no reader. Its entire consumer surface is interaction-driven: bootstrap.Modal (Tools/Html.ts), 737 // bootstrap.Collapse (Handler_PageCheckout), doGetCurrentPosition, and the data-api attributes in 738 // the markup -- dropdown, collapse, tab, dismiss. None of it runs at load. 739 // 740 // Defined here rather than in the bundle because callers reach it from inline script. 741 var m_pageScriptUrl = "https://cdn.brandfull.com/scriptPage.min.js"; 742 743 function doLoadPageScript(callBack = function () { }) { 744 doLoadScript(callBack, m_pageScriptUrl); 745 } 746 747 // Google Maps, requested once per document rather than once per view. 748 // 749 // doLoadScript dedupes by exact url string, and five views asked for Maps with four different 750 // strings -- two callback names (doInitMap, doInitGoogleMap), and Page_CreateSupport on 751 // maps.google.com rather than maps.googleapis.com, without libraries=places. Ajax navigation 752 // never reloads the document, so visiting two of those pages in one session appended two script 753 // tags for the same library: "You have included the Google Maps JavaScript API multiple times", 754 // followed by the custom elements it registers being defined twice 755 // (Element with name "gmp-internal-dialog" already defined). 756 // 757 // So: one url, and one name for Google to call. Pages hand their own initializer to 758 // doLoadGoogleMaps instead of naming it in a query string. Note the initializer
758s are read at 759 // call time, which is what keeps Page_About and Page_CreateSupport from fighting over the 760 // window.doInitGoogleMap they both define -- each view's inline block re-runs on its own ajax 761 // swap, so the one queued is always the current page's. 762 var m_googleMapUrl = "https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyBELKgTURcJMCbnFgFY4aizo0dbwokRqU4&callback=doGoogleMapsReady&loading=async&language=ar"; 763 var m_isGoogleMapsReady = false; 764 var m_listGoogleMapsReady = []; 765 766 // The single name in the url above. Global because Google resolves it off window. 767 function doGoogleMapsReady() { 768 m_isGoogleMapsReady = true; 769 while (m_listGoogleMapsReady.length > 0) 770 doRunCallBack(m_listGoogleMapsReady.shift()); 771 } 772 773 function doLoadGoogleMaps(callBack = function () { }) { 774 // scriptPage.min.js first: every page initializer this fans out to reaches into 775 // _Js/GoogleMapGetCurrentLocation.js -- doInitMap is defined there outright, and 776 // Page_About / Page_CreateSupport push into the `markers` array it declares. 777 doLoadPageScript(function () { 778 if (m_isGoogleMapsReady) { 779 doRunCallBack(callBack); 780 return; 781 } 782 783 m_listGoogleMapsReady.push(callBack); 784 doLoadScript(function () { }, m_googleMapUrl); 785 }); 786 } 787 788 // Bootstrap installs its data-api listeners on document when it evaluates, so a click that lands 789 // before the file does is a click that does nothing. Hence arming on the earliest signals a real 790 // visitor produces -- hover and scroll both precede the first tap far more often than not -- and 791 // not merely on the click itself. Capture phase so a stopPropagation somewhere cannot hide them. 792 // 793 // The load-event fallback is for the visitor who reads without touching anything. It is behind 794 // `load` on purpose: an idle callback armed any earlier competes with the page's own bind for the 795 // main thread, which is the cost this whole change exists to remove. 796 (function () { 797 var isArmed = false; 798 799 function doArmPageScript() { 800 if (isArmed) 801 return; 802 isArmed = true; 803 doLoadPageScript(); 804 } 805 806 var listEvent = ['pointerover', 'pointerdown', 'touchstart', 'keydown', 'scroll']; 807 for (var i = 0; i < listEvent.length; i++) 808 window.addEventListener(listEvent[i], doArmPageScript, { capture: true, once: true, passive: true }); 809 810 window.addEventListener('load', function () { 811 if (typeof window.requestIdleCallback == "function") 812 window.requestIdleCallback(doArmPageScript, { timeout: 3000 }); 813 else 814 setTimeout(doArmPageScript, 1000); 815 }); 816 })(); 817 818 // The Portal's head hook -- GTM, and through GTM's Custom HTML tags the Facebook, Snapchat and 819 // TikTok pixels -- injected on the same signals as scriptPage.min.js instead of parsed inline. 820 // 821 // It used to sit below this script as raw markup, which meant every visitor parsed, compiled and 822 // EXECUTED a tag manager plus three pixels before the browser had seen a single byte of <body>. 823 // Measured on the Blends home page: TBT 1,700ms, FCP 3.3s, and three rounds of asset trimming 824 // ahead of this moved FCP by 0.1s because none of them touched the thing actually holding the 825 // main thread. The error-swallow list at the top of this file already names googletagmanager.com 826 // and the Snapchat WebJSBridge -- the cost was known, only its timing was not. 827 // 828 // A <template> because its content is INERT: the parser builds the nodes but runs no script and 829 // fetches no src, which is the whole point. innerHTML would have been inert too, but only by 830 // accident and only for scripts -- an <img> in the blob would still have been fetched. 831 (function () { 832 var isArmed = false; 833 var isInjected = false; 834 835 function doInjectHeadScript() { 836 if (isInjected) 837 return; 838 isInjected = true; 839 840 var holder = document.getElementById('UI_headScript'); 841 if (!holder) 842 return; 843 844 var fragment = holder.content.cloneNode(true); 845 var listNode = Array.prototype.slice.call(fragment.childNodes); 846 847 for (var i = 0; i < listNode.length; i++) { 848 var node = listNode[i]; 849 850 // A
850<script> moved out of a template stays inert -- "already started" is not the 851 // flag, but a parser-inserted script that was never executed will not execute on 852 // insertion either. It has to be re-created as a fresh element. 853 if (node.nodeName == 'SCRIPT') { 854 var script = document.createElement('script'); 855 for (var a = 0; a < node.attributes.length; a++) 856 script.setAttribute(node.attributes[a].name, node.attributes[a].value); 857 script.text = node.text; 858 859 // async=false on a DYNAMICALLY created script means "in-order", not "blocking": 860 // externals then execute in insertion order relative to each other. GTM's inline 861 // snippet seeds window.dataLayer and must run before gtm.js reads it, and the 862 // default async=true would have let that race. 863 if (script.src) 864 script.async = false; 865 866 document.head.appendChild(script); 867 } 868 else 869 document.head.appendChild(node); 870 } 871 } 872 873 function doArmHeadScript() { 874 if (isArmed) 875 return; 876 isArmed = true; 877 878 // The blob calls doSetThirdParty (see Tools/ThirdPartyDefer.ts, which stubs that name 879 // for exactly this reason). The stub ships in script.min.js, which is fetched async, so 880 // waiting on its ready callback is what guarantees the call lands somewhere. In the old 881 // inline arrangement it did not: the blob ran at parse time, well before the bundle. 882 if (typeof window.doSetThirdParty == "function") { 883 doInjectHeadScript(); 884 return; 885 } 886 887 doLoadScript(doInjectHeadScript); 888 889 // Backstop, because a callback registered on script.min.js never fires if that bundle 890 // errors -- and "the bundle failed" must not also mean "no analytics for that visit". 891 // doInjectHeadScript is idempotent, so whichever path arrives first wins. 892 setTimeout(doInjectHeadScript, 4000); 893 } 894 895 var listHeadEvent = ['pointerover', 'pointerdown', 'touchstart', 'keydown', 'scroll']; 896 for (var h = 0; h < listHeadEvent.length; h++) 897 window.addEventListener(listHeadEvent[h], doArmHeadScript, { capture: true, once: true, passive: true }); 898 899 // WHEN the blob runs, and the reason it is not simply "on load, then idle" any more. 900 // 901 // Measured on the Blends home page: the tag manager and the pixels it injects through its 902 // Custom HTML tags cost 2,217 ms of main-thread CPU -- more than every first-party script 903 // on the page put together (1,944 ms). Five Google containers alone are 1,204 ms of that, 904 // then Facebook 417, Clarity 252, TikTok 137, Pinterest 110, Snapchat 97. 905 // 906 // The old trigger was `load` plus requestIdleCallback(timeout 3000). Both fire while the 907 // page is still doing its own work: `load` only means subresources finished, not that the 908 // bind and the div hydration have, and a 3-second timeout fires whether or not an idle slot 909 // ever appeared. So 2.2 seconds of vendor script landed on a main thread that was still 910 // building the page. 911 // 912 // "Stable" is defined here as the browser itself defines it -- no long task for a 913 // continuous stretch -- rather than as a delay someone picked. Every long task pushes the 914 // decision back; when the page finally goes quiet for m_headQuietMs the blob goes in on the 915 // next idle slot. That is the same shape as TTI with a shorter quiet window, which is the 916 // point: analytics should start as soon as the page has actually settled, not at a fixed 917 // time that is too early on a slow device and too late on a fast one. 918 // 919 // Interaction still wins outright, above: a visitor who is already touching the page has a 920 // usable page by definition, and their session is the one most worth recording. 921 var m_headQuietMs = 2000; // continuous no-long-task stretch that counts as settled 922 var m_headCapMs = 10000; // hard backstop -- see below 923 var m_headQuietTimer = null; 924 925 function doDelayHeadScript() { 926 clearTimeout(m_headQuietTimer); 927 m_headQuietTimer = setTimeout(function () { 928 if (typeof window.requestIdleCallback == "function") 929 window.requestIdleCallback(doArmHeadScript, { timeout: 2000 }); 930 else 931 doArmHeadScript(); 932 }, m_headQuietMs); 933 } 934 935 window.addEventListener('load', function () { 936 // A main thread that never goes quiet -- a slow device, a runaway third-party, a tab 937 // that stays busy -- must not mean no analytics at all for that visit. This fires 938 // regardless; doArmHeadScript is idempotent, so whichever path gets there first wins. 939 setTimeout(doArmHeadScript, m_headCapMs); 940 941 // longtask is Chromium-only. Where it is missing (Safari, Firefox) there is nothing to 942 // observe, so the quiet timer simply runs once from load and behaves like the old 943 // fixed delay -- degraded to the previous behaviour, not to no behaviour. 944 try { 945 if (typeof PerformanceObserver == "function" 946 && PerformanceObserver.supportedEntryTypes 947 && PerformanceObserver.supportedEntryTypes.indexOf('longtask') != -1) { 948 new PerformanceObserver(function () { 949 if (!isArmed) 950 doDelayHeadScript(); // still busy -- restart the quiet window 951 }).observe({ type: 'longtask', buffered: false }); 952 } 953 } 954 catch (error) { console.log(error); } 955 956 doDelayHeadScript(); 957 }); 958 })(); 959 960</script>
vendor: 2 bytes, line 960
960
961<script> 962 (function () { 963 // The reference file is NOT a stylesheet -- it opens with an HTML comment header and 964 // wraps the payload in <style>, exactly as the Portal field must. So it cannot be a 965 // <link>: the header would be a parse error and the tags are not CSS. Fetch it and 966 // hand the browser the same string @Html.Raw would have emitted. 967 var url = 'https://brandfull.com/Themes/Cartzilla/_Css/BrandFull/StyleCss_Script.reference.css?version=639260136446764345'; 968 969 fetch(url, { cache: 'no-store' }) 970 .then(function (response) { 971 if (!response.ok) 972 throw new Error('StyleCss_Script.reference.css -> HTTP ' + response.status); 973 974 return response.text(); 975 }) 976 .then(function (text) { 977 // Take what is BETWEEN the tags. Assigning the raw text to innerHTML would put a 978 // literal <style> inside a <style>, which parses as nothing at all. 979 var match = /<style[^>]*>([\s\S]*?)<\/style>/i.exec(text); 980 if (!match) { 981 console.warn('[StyleCss_Script test] no <style> block in ' + url); 982 return; 983 } 984 985 // Appended to <head> AFTER the site bundle link, so a :root here outranks the 986 // same :root in StyleApp.css -- the same seam the Portal value occupies. 987 var style = document.createElement('style'); 988 style.id = 'UI_styleCssScriptTest'; 989 style.textContent = match[1]; 990 document.head.appendChild(style); 991 }) 992 .catch(function (error) { console.warn('[StyleCss_Script test] ' + error.message); }); 993 })(); 994</script>
994 995<template id="UI_headScript"> 996<!-- Google Tag Manager -->
997<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s);j.async=true;j.src="https://shn.brandfull.com/cjbruxijtzaj.js?"+i;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','ezx8gtx3=AwVHMz4kVSU%2BKzA3PSU0UxxcSFpbTxwbVwMIFQQNHgAGDVQXBQQ%3D');</script>
997 998<!-- End Google Tag Manager --> 999 1000</template> 1001 1002</head> 1003 1004<body id="UI_body" style="overflow-y: clip;" class="noPadding"> 1005 1006 1007 1008 1009 1010 1011 <h1 class="seo-hidden">ØµÙØØ© Ø§ÙØ¯Ø¹Ù </h1> 1012 <h2 class="seo-hidden"></h2> 1013 1014
1014<script type="application/ld+json"> 1015 { 1016 "@context": "https://schema.org", 1017 "@type": "OnlineStore", 1018 "name": "Brandfull", 1019 "alternateName": "Brandfull", 1020 "description": "At Brandfull we believe in second chances and the thrill of discovering hidden treasures. Our journey began with a simple idea: to bring new life into pre-loved items while offering our customers unique finds that resonate with their individuality.", 1021 "knowsLanguage": "AR,EN", 1022 "sameAs": [ 1023 "https://www.facebook.com/brandfullCom/", 1024 "https://twitter.com/brandful_l", 1025 "https://www.instagram.com/brandfull_ksa/", 1026 "https://api.whatsapp.com/send?phone=966592905003", 1027 "https://www.snapchat.com/add/brandful_l" 1028 ], 1029 "url": "https://brandfull.com", 1030 "logo": "https://brandfull.com/_Image/favicon.png","hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"SA","returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":7,"returnMethod":"https://schema.org/ReturnByMail","returnFees":"https://schema.org/FreeReturn","refundType":"https://schema.org/FullRefund"} 1031 } 1032 </script>
1032 1033 1034
1034<script type="application/ld+json"> 1035 { 1036 "@context": "https://schema.org", 1037 "@type": "ContactPoint", 1038 "@contactType": "Customer Service", 1039 "availableLanguage": "AR,EN", 1040 "email": "[email protected]", 1041 "telephone": "966592905003" 1042 } 1043 </script>
1043 1044
1044<script type="application/ld+json"> 1045 { 1046 "@context": "https://schema.org", 1047 "@type": "WebSite", 1048 "name": "WebSite Brandfull", 1049 "url": "https://brandfull.com", 1050 "potentialAction": [ 1051 { 1052 "@type": "SearchAction", 1053 "target": "https:/brandfull.com/Shop/search?q={search_term_string}", 1054 "query-input": "required name=search_term_string" 1055 } 1056 ] 1057 } 1058 </script>
1058 1059 1060 1061 <!-- Home Popup Section --> 1062 <!-- End Screen Load Popup Section --> 1063 <!-- START HEADER --> 1064 1065 1066 1067
1068<script type="application/javascript"> 1069 1070 window.doClosePopUp = function () { 1071 document.querySelectorAll('.dropdown-menu.show').forEach(function (option) { 1072 option.classList.remove('show'); 1073 }); 1074 document.querySelectorAll('.dropdown-menu.hide').forEach(function (option) { 1075 option.classList.remove('hide'); 1076 }); 1077 } 1078 1079 window.doShowQuickPopup = function (id, isFocus) { 1080 if (isFocus == true) 1081 m_handlerLayout.doGetQuickFilter(); 1082 else 1083 setTimeout(function () { 1084 m_handlerLayout.m_showQuickPopUp(false); 1085 }, 250) 1086 } 1087 1088 window.doJSClickSearch = function (){ 1089 var searchSection = document.querySelector('#UI_searchSection'); 1090 if(searchSection.classList.contains('show')) 1091 searchSection.classList.remove('show'); 1092 else 1093 searchSection.classList.add('show'); 1094 1095 var searchIcon = document.querySelector('#UI_searchIcon'); 1096 if(searchIcon.classList.contains('ci-search')){ 1097 searchIcon.classList.remove('ci-search'); 1098 searchIcon.classList.add('ci-close'); 1099 } 1100 else{ 1101 searchIcon.classList.remove('ci-close'); 1102 searchIcon.classList.add('ci-search'); 1103 } 1104 } 1105 doLoadScript(function () { 1106 if (!ko.dataFor(document.getElementById('UI_headerSession'))) { 1107 ko.applyBindings(m_handlerSession, document.getElementById("UI_headerSession")); 1108 } 1109 1110 if (!ko.dataFor(document.getElementById('UI_LayoutHeader'))) { 1111 ko.applyBindings(m_handlerLayout, document.getElementById("UI_LayoutHeader")); 1112 ko.applyBindings(m_handlerLayout, document.getElementById("UI_preLoader")); 1113 } 1114 1115 var navBar = document.getElementById("UI_menuNavBar"); 1116 if (navBar) navBar.style.visibility = "visible"; 1117 var searchPopup = document.getElementById("UI_searchQuickPopup"); 1118 if (searchPopup) searchPopup.style.visibility = "visible"; 1119 var layoutHeader = document.getElementById("UI_LayoutHeader"); 1120 if (layoutHeader) layoutHeader.style.visibility = "visible"; 1121 // After applyBindings above, so every marked block already carries the inline display its 1122 // binding gave it and nothing flashes as the gate lifts. 1123 if (layoutHeader) layoutHeader.classList.remove("ko-pending"); 1124 1125 doJsDropdownSelect(); 1126 1127 }); 1128 1129</script>
1129 1130 1131 1132<header id="UI_LayoutHeader" class="bg-light shadow-sm fixHeightHeader ko-pending"> 1133 1134 <div id="UI_menuQuick" class="topbar topbar-dark bg-darker py-sm-1 py-md-0"> 1135 <div class="container"> 1136 <div class="topbar-text dropdown d-md-none"> 1137 <a class="topbar-link dropdown-toggle" href="#" data-bs-toggle="dropdown">Ø±ÙØ§Ø¨Ø· Ù ÙÙØ¯Ø©</a> 1138 <ul class="dropdown-menu"> 1139 <li> 1140 <a class="dropdown-item textAlignAuto" enable-href="false" href="/Support"><i class="ci-support text-muted me-2-Auto"></i>Ø§ØªØµÙ Ø¨ÙØ§</a> 1141 </li> 1142 <li> 1143 <a class="dropdown-item textAlignAuto" href="#" target="_blank" enable-href="true" data-bind="attr:{href:m_handlerSession.m_currentCompany._whatsappLink}" rel="noreferrer"> 1144 <i class="ci-whatsapp text-muted me-2-Auto"></i>ÙØ§ØªØ³ اب 1145 </a> 1146 </li> 1147 </ul> 1148 </div> 1149 <div class="topbar-text text-nowrap d-none d-md-inline-block"> 1150 <a class="topbar-link" enable-href="false" href="/Support"><i class="ci-support me-2-Auto"></i>Ø§ØªØµÙ Ø¨ÙØ§</a> 1151 <!-- ko if: !doCheckEmptyData(m_handlerSession.m_currentCompany._whatsappLink()) --> 1152 <a class="btn-social bs-light bs-whatsapp me-1-Auto mb-1" href="#" enable-href="true" data-bind="attr:{href:m_handlerSession.m_currentCompany._whatsappLink}" target="_blank" rel="noreferrer" aria-label="Share WhatsApp"> 1153 <i class="ci-whatsapp font-size-14"></i> 1154 </a> 1155 <!-- /ko --> 1156 </div> 1157 1158 <slotHeader class="bf-announceSlot"></slotHeader> 1159 1160 <div class="text-nowrap"> 1161 <div class="topbar-text dropdown disable-autohide"> 1162 <a class="topbar-link dropdown-toggle" href="#" data-bs-toggle="dropdown"> 1163 <span class="px-1" data-bind="text: doGetCulture()=='ar'? 'عربÙ':'English'"></span> 1164 <span class="px-1">/</span><span class="px-1" data-bind="text: m_handlerSession.m_currentCurrency._code"></span> 1165 </a> 1166 1167 <ul class="dropdown-menu dropdown-menu-end"> 1168 <!-- ko if: m_handlerSession.m_currentCompany._currences().length > 1 --> 1169 <li class="dropdown-item"> 1170 <select class="form-select form-select-sm" style=" padding: 5px;" data-bind="value: m_handlerSession.m_currentCurrency._code, options: m_handlerSession.m_currentCompany._currences, optionsText: '_code', optionsValue: '_code'"> 1171 </select> 1172 </li> 1173 <!-- /ko --> 1174 <!-- ko if: m_handlerSession.m_listCompany().length > 1 --> 1175 <li class="dropdown-item"> 1176 <div class="fs-sm fw-medium mb-1 w-100 textAlignAuto">Ø¨ÙØ¯</div> 1177 <select class="form-select" style=" padding: 5px;" data-bind="value: m_handlerSession.m_currentCompany._id, options: m_handlerSession.m_listCompany, optionsText: '_countryName', optionsValue: '_id'"> 1178 </select> 1179 </li> 1180 <!-- /ko --> 1181 <li> 1182 <button class="dropdown-item d-flex align-items-center font-size-10" onclick="m_handlerSession.doSetCulture('ar')"> 1183 <span class="langImage me-2-Auto" data-bind="style:{'background-position-x': doGetlangImage('ar')}" style="background-image: url(https://cdn.brandfull.com/Media/BrandFull/images.png?version=639260136446764345)"></span> 1184 <span>عربÙ</span> 1185 </button> 1186 </li> 1187 <li> 1188 <button class="dropdown-item d-flex align-items-center font-size-10" onclick="m_handlerSession.doSetCulture('en')">
1189 <span class="langImage me-2-Auto" data-bind="style:{'background-position-x': doGetlangImage('en')}" style="background-image: url(https://cdn.brandfull.com/Media/BrandFull/images.png?version=639260136446764345)"></span> 1190 <span>English</span> 1191 </button> 1192 </li> 1193 </ul> 1194 </div> 1195 </div> 1196 </div> 1197 </div> 1198 <div class="navbar-sticky bg-light pt-1"> 1199 <div class="navbar navbar-expand-lg navbar-light py-0"> 1200 <div class="container bf-headerRow"> 1201 <div id="UI_searchSection" class="input-group widthSearch mt-sm-2 collapse"> 1202 <div class="input-group d-lg-flex m-0 "> 1203 <input autocomplete="off" class="form-control focus-black m_search" type="text" data-bind="value: m_search" onfocusin="doShowQuickPopup('UI_searchQuickPopup', true)" onfocusout="doShowQuickPopup('UI_searchQuickPopup', false)" placeholder="Ø§ÙØ¨ØØ« Ø¹Ù Ø§ÙØ¹Ùا٠ة Ø§ÙØªØ¬Ø§Ø±ÙØ©" /> 1204 <div class="m_searchIcons position-absolute top-50 translate-middle-y text-muted"> 1205 <i class="ci-camera pointer" data-bind="click: window.doOpenCropper.bind($root, $root, GlobalSettingTranslateEnum.PathObjectPicture, m_currentPicture)"></i> 1206 <i class="ci-search pointer" data-bind="click: $root.doSearchByWord.bind($root)"></i> 1207 </div> 1208 </div> 1209 1210 1211 1212<div id="UI_searchQuickPopup" data-koPending class="quickPopUp border rounded-1 p-3 mt-md-n1 bg-white" data-bind="visible:m_showQuickPopUp()"> 1213 1214 <!-- ko if: m_listQuickFilterCategory().length != 0 --> 1215 <b class="font-size-10 fw-bolder mt-2 mb-1 text-accent">ÙØ¦Ø§Øª Ù ÙØ¶ÙØ© ÙØ¯ÙÙÙ </b> 1216 <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterCategory"> 1217 <a class=" border rounded me-1 mb-1" href="#" enable-href="false" data-bind="click: doLoadMenuLink.bind($root, doGetLinkQuickFilter($data._value())) , attr:{href: doGetLinkQuickFilter($data._value()) }"> 1218 <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()"> 1219 </div> 1220 </a> 1221 </div> 1222 <!-- /ko --> 1223 <!-- ko if: m_listQuickFilterColor().length != 0 --> 1224 <b class="font-size-10 fw-bolder mt-3 mb-1 text-accent ">اÙÙÙ٠ذات شعبÙÙ</b> 1225 <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterColor"> 1226 <a class=" border rounded me-1 mb-1" href="#" enable-href="false" data-bind="click: m_handlerLayout.doSetSearch.bind($root, $data._name()), attr:{href: doGetLinkQuickFilter($data._name()) }"> 1227 <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()"> 1228 </div> 1229 </a> 1230 </div> 1231 <!-- /ko --> 1232 <!-- ko if: m_listQuickFilterTag().length != 0 --> 1233 <b class="font-size-10 fw-bolder mt-3 mb-1 text-accent">اÙÙ Ø§Ø±ÙØ§Øª Ø§ÙØ£Ùثر Ø´Ø¹Ø¨ÙØ©</b> 1234 <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterTag"> 1235 <a class=" border rounded me-1 mb-1" href="#" enable-href="false" data-bind="click: m_handlerLayout.doSetSearch.bind($root, $data._name()), attr:{href: doGetLinkQuickFilter($data._name()) }"> 1236 <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()"> 1237 </div> 1238 </a> 1239 </div> 1240 <!-- /ko --> 1241 1242</div> 1243 1244 </div> 1245 <div class="bf-headerRow-lead"> 1246 <a class="navbar-tool d-lg-none" href="/#UI_menuSection" aria-label="menu" name="menu" onclick="doClosePo
1246pUp()" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="UI_menuSection"> 1247 <span class="navbar-tool-icon-box"><i class="navbar-toggler-icon mt-1"></i></span> 1248 </a> 1249 </div> 1250 <div class="bf-headerRow-brand"> 1251 <a class="navbar-brand textAlignAuto" href="https://brandfull.com" enable-href="true"> 1252 <img class="headerBrandLogo" style="--logo-width: 125px; --logo-height: 41px;" fetchpriority="high" decoding="async" src="https://cdn.brandfull.com/Media/BrandFull/headerDesktopLogo_ar.png?format=webp&size=Thumb&version=639260136446764345" width="905" height="297" alt="AltLogo" title="Ø§ÙØ¹ÙÙØ§ÙØ§ÙØ´Ø¹Ø§Ø±" /> 1253 </a> 1254 </div> 1255 <!-- ko stopBinding: true --> 1256 <div id="UI_headerSession" class="navbar-toolbar d-flex flex-shrink-0 align-items-center bf-headerRow-trail"> 1257 1258 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1259 <a name="Favorites" aria-label="Favorites" class="navbar-tool-icon-box dropdown-toggle flipAuto d-lg-block d-md-none d-sm-none" enable-href="false" href="/Account/Favorites"> 1260 <i class="navbar-tool-icon ci-heart" style="width: 45px;"></i> 1261 </a> 1262 <div class="navbar-tool dropdown pointer d-lg-flex d-md-none d-sm-none" data-bind="visible: doCheckUUID(m_currentUser._id())" onmouseenter="doPrepareAdvertisement()"> 1263 <span class="navbar-tool-icon-box dropdown-toggle flipAuto" onclick="doOpenAdvertisement()"> 1264 <span class="navbar-tool-label flipAuto" data-bind="text: m_countAdvertisement() > 99 ? '99+' : m_countAdvertisement()"></span> 1265 <i class="navbar-tool-icon ci-bell" style="width: 45px;"></i> 1266 </span> 1267 <div id="UI_menuWebAdvertisement" class="dropdown-menu dropdown-menu-end textAlignAuto"> 1268 <div class="widget widget-cart px-3 pt-2 pb-0"> 1269 <div class="d-flex align-items-center justify-content-between"> 1270 <!-- ko if: !m_handlerLayout.m_isViewMobile() --> 1271 <div class="col-md-10"> 1272 <!-- ko if: m_enableNotifGrant() --> 1273 <button id="UI_notifGrant" class="btn d-flex align-content-between align-items-center font-size-10 p-1 " onclick="doGetPermissionNotification()"> 1274 <i class="ci-settings me-2-Auto font-size-14 "></i> 1275 <span class="form-check-label elide text-black fw-bolder heartbeat" for="UI_agreeWebPush"> 1276 ابÙÙ٠عÙÙ Ø§Ø·ÙØ§Ø¹ 1277 </span> 1278 </button> 1279 <!-- /ko --> 1280 <!-- ko if: m_enableNotifDenied() --> 1281 <div id="UI_notifDenied" class="d-flex align-content-between align-items-center font-size-10 p-1 "> 1282 <i class="ci-announcement me-2-Auto font-size-14 fw-bolder"></i> 1283 <span class="form-check-label elide text-danger fw-bolder heartbeat"> 1284 Ø§ÙØ¥Ø´Ø¹Ø§Ø±Ø§Øª Ù ØØ¬Ùبة. شغÙÙØ§ Ù٠إعدادات اÙÙ ØªØµÙØ ÙØªØØµÙ عÙÙ ØªÙØ¨ÙÙØ§Øª. 1285 </span> 1286 </div> 1287 <!-- /ko --> 1288 1289 </div> 1290 <!-- /ko --> 1291 </div> 1292 1293 <div id="UI_notificationList" data-simplebar data-simplebar-auto-hide="false" style="overflow-x: hidden;max-height: 21rem;" data-bind="visible: m_listAdvertisement().length!=0, foreach: { data: m_showAdvertisement() ? m_listAdvertisement() : [] }"> 1294 <div class="border-bottom py-1 me-3-Auto d-flex justify-content-between border-danger" style=" border-bottom-style: dotted !important;" data-bs-dismiss=""> 1295 <label class="form-text elide w-75 pointer" data-bind="click: $root.doSetTaged.bind($root, $data, true), text:$data._subject()"></label> 1296 <b class="form-check-label textAlignReverse font-size-10 d-inline-block mb-n2 fw-light" data-bind="click: $root.doSetTaged.bind($root, $data, true), text: doCalcDateDifference(doCastFromUTC($data._dateCreate()))"></b> 1297 </div> 1298</div> 1299 1300 </div> 1301 </div> 1302 </div> 1303 1304 1305 <!-- /ko --> 1306 <div id="UI_userSession" class="navbar-tool dropdown pointer d-lg-flex d-md-none d-sm-none">
1307 <span class="navbar-tool-icon-box " onclick="doOpenProfile()"> 1308 <i class="navbar-tool-icon ci-user "></i> 1309 </span> 1310 1311 <span class=" d-none d-lg-flex" style="padding-left:unset; max-width: 75px;" href="#"> 1312 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1313 <small class="elide text-black" data-bind="text: m_currentUser._name()"></small> 1314 <!-- /ko --> 1315 <!-- ko if: !doCheckUUID(m_currentUser._id()) --> 1316 <small class="elide text-black">ØØ³Ø§Ø¨</small> 1317 <!-- /ko --> 1318 </span> 1319 <!-- Session dropdown--> 1320 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1321 <div class="dropdown-menu dropdown-menu-end"> 1322 <div class="widget widget-cart px-3 pt-2 pb-3 textAlignAuto"> 1323 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1324 <div class="fs-sm fw-medium mb-1">ØØ³Ø§Ø¨</div> 1325 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Profile"> 1326 <i class="ci-user opacity-60 me-2-Auto"></i>اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ 1327 </a> 1328 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Invoices"> 1329 <i class="ci-basket opacity-60 me-2-Auto"></i>اÙÙÙØ§ØªÙر 1330 </a> 1331 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Supports"> 1332 <i class="ci-help opacity-60 me-2-Auto"></i>ØªØ°Ø§ÙØ± 1333 </a> 1334 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Messages"> 1335 <i class="ci-message opacity-60 me-2-Auto"></i>رسائ٠1336 </a> 1337 1338 <div class="dropdown-divider"></div> 1339 <a class="dropdown-item d-flex align-items-center py-1" href="#" enable-href="false" data-bind="click: $root.doLogOut.bind($root, '/Account/LogOff?Value=https%3A%2F%2Fbrandfull.com%2FSupport%2FCreate')"> 1340 <i class="ci-sign-out opacity-60 me-2-Auto"></i>تسجÙÙ Ø§ÙØ®Ø±Ùج 1341 </a> 1342 <!-- /ko --> 1343 </div> 1344 </div> 1345 <!-- /ko --> 1346 </div> 1347 1348 <a href="#" aria-label="Ø§ÙØ¨ØØ«" name="Search" class="navbar-tool-icon-box dropdown-toggle flipAuto" enable-href="false" onclick="doJSClickSearch()"> 1349 <i id="UI_searchIcon" class="navbar-tool-icon ci-search animate-target" style="width: 45px;"></i> 1350 </a> 1351 <div id="UI_shopNav" class="navbar-tool pointer" onclick="m_handlerSession.doOpenCartDrawer();"> 1352 <span class="navbar-tool-icon-box flipAuto"> 1353 <span class="navbar-tool-label flipAuto" data-bind="text: doGetCartCount()"></span> 1354 <i class="navbar-tool-icon bold ci-card-bag"></i> 1355 </span> 1356 <span class="d-flex flex-column d-none d-md-flex ps-2-Auto"> 1357 <small class="font-size-10 text-black">Ø³ÙØ© Ø§ÙØªØ³ÙÙ</small> 1358 <!-- ko if: m_currentCart._listCartDetailModel().length!=0 --> 1359 <span class="text-accent fs-base font-size-12" data-bind="html: $root.doCalcPriceDynamic(m_currentCart._total(), true)"></span> 1360 <!-- /ko --> 1361 </span> 1362 </div> 1363 1364 </div> 1365 <!-- /ko --> 1366 </div> 1367 <!-- Search--> 1368 </div> 1369 1370 1371 <div id="UI_menuNavBar" class="navbar navbar-expand-lg navbar-light navbar-stuck-menu mt-n2 pt-0 pb-2" style="visibility: hidden; margin-top: auto !important;"> 1372 <div class="container "> 1373 <div id="UI_menuSection" class="navbar-collapse collapse" data-bind="class: m_listCategoryMenuDepartmentHeader().length ==0 ? 'justify-content-around':''"> 1374 1375<style> 1376 1377 /* The sprite URL is per-request (CDN base + m_version), so it cannot live in the bundled 1378 CSS. It is emitted once here and read by .categoryMerge in StyleCartzilla-Menu.css. 1379 It used to be a full inline `background: url(...)` on EVERY category node -- in this file 1380 and, worse, inside Template_ItemDeskMenu / Template_ItemMobileMenu, which recurse, so the 1381 whole CDN path was re-emitted into the live DOM once per category at every depth. */ 1382 :root { 1383 --category-sprite: url('https://cdn.brandfull.com/Content/category/Merge.png?v=639260136446764345'); 1384 } 1385 1386 .quickPopUp { 1387 visibility: hidden; 1388 z-index: +100; 1389 position: absolute; 1390 top: 47px; 1391 } 1392 1393 [lang="ar"] .quickPopUp { 1394 right: 1px; 1395 } 1396 1397 [lang="en"] .quickPopUp { 1398 left: 1px; 1399 } 1400 1401 1402 @media screen and (max-width:767px) { 1403 .quickPopUp { 1404 z-index: +1; 1405 position: unset; 1406 top: 81px; 1407 width: 100%; 1408 border: hidden !important; 1409 } 1410 } 1411</style> 1412
1413<script id="Template_ItemDeskMenu" type="text/html"> 1414 1415 1416 <ul class="dropdown-menu " data-bind="foreach: $data._list, css:{'d-block fixRtl': $data.mode=='block' }"> 1417 <li class="" data-bind="class: $data._list() != 0 ? 'dropdown':''"> 1418 <a class="dropdown-item d-flex" href="#" enable-href="false" data-bind=" 1419 class: $data._list() != 0 ? 'dropdown-toggle':'', 1420 attr:{href: doGetLinkCategory($data) }"> 1421 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1422 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1423 </span> 1424 <!-- /ko --> 1425 <span class="categoryColor menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1426 </a> 1427 <!--ko if : $data._list() != 0 --> 1428 <!-- ko run: $data.mode='' --><!-- /ko --> 1429 <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko --> 1430 <!-- /ko --> 1431 </li> 1432 </ul> 1433 1434</script>
vendor: 2 bytes, line 1434
1434
1435<script id="Template_ItemDeskMegaMenu" type="text/html"> 1436 1437 <ul class="dropdown-menu " data-bind="foreach: $data._list"> 1438 <li class="dropdown mega-dropdown"> 1439 <a class="dropdown-item dropdown-toggle d-flex" href="#" enable-href="false" data-bind="class: $data._list() != 0 ? 'dropdown-toggle':'', attr:{href: !doCheckEmptyData($data._link())? $data._link() : '/Shop'+'/'+$data._code() }" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="true"> 1440 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1441 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1442 </span> 1443 <!-- /ko --> 1444 <span class="categoryColor menuSpan " data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1445 </a> 1446 </li> 1447 </ul> 1448 1449 1450</script>
vendor: 2 bytes, line 1450
1450
1451<script id="Template_ItemMobileMenu" type="text/html"> 1452 1453 <ul class="widget-list mt-1" data-bind="attr:{'id': 'UI_'+$data._id()}, css:{'collapse collapseShow mx-3': $data.mode=='block'}, foreach: $data._list"> 1454 <li class="widget-list-item"> 1455 <a class="dropdown-item d-flex" href="#" enable-href="false" data-bind="attr:{'aria-controls': 'UI_'+$data._id(), 'data-bs-target':'#UI_'+$data._id(), href: doGetLinkCategory($data) }"> 1456 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1457 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1458 </span> 1459 <!-- /ko --> 1460 <span class="categoryColor font-size-14" data-bind="class: ($data._list() != 0 && $parent.mode=='block') ? 'fw-medium':'fw-light', text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorMobileHex()}"></span> 1461 </a> 1462 <!--ko if : $data._list() != 0 --> 1463 <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko --> 1464 <!-- /ko --> 1465 </li> 1466 </ul> 1467 1468</script>
1468 1469 1470 1471 1472<!-- ko ifnot: m_isMenuMobile() --> 1473<!-- ko if: $root.m_listCategoryMenuDepartmentHeader().length!=0 --> 1474<ul class="navbar-nav d-none d-lg-flex navbar-mega-nav pe-lg-2-Auto me-lg-2-Auto" style="padding-right:unset !important"> 1475 <li class="nav-item dropdown"> 1476 <a class="nav-link dropdown-toggle ps-lg-0-Auto " href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside"> 1477 <i class="ci-menu align-middle mt-n1 me-2-Auto"></i> 1478 Ø§ÙØ§Ø¯Ø§Ø±Ø§Øª 1479 </a> 1480 <ul class="dropdown-menu " data-bind="foreach: $root.m_listCategoryMenuDepartmentHeader"> 1481 <li class="dropdown mega-dropdown"> 1482 <a class="dropdown-item dropdown-toggle d-flex" href="#" enable-href="false" data-bind="class: $data._list() != 0 ? 'dropdown-toggle':'', attr:{href: doGetLinkCategory($data) }" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="true"> 1483 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1484 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1485 </span> 1486 <!-- /ko --> 1487 <span class="categoryColor menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1488 </a> 1489 <div class="dropdown-menu p-0 megaMenuRtl" data-bind="style: {'min-width': doCheckEmptyData($data._bannerName()) ? '0rem':'12rem'}"> 1490 <div class="d-flex flex-wrap flex-sm-nowrap p-2"> 1491 <div style="max-width: 12rem;" data-bind="class: doCheckEmptyData($data._bannerName()) ? '':'mega-dropdown-column'"> 1492 <!--ko if : $data._list() != 0 --> 1493 <!-- ko run: $data.mode='block' --><!-- /ko --> 1494 <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko --> 1495 <!-- /ko --> 1496 </div> 1497 <!--ko if : !doCheckEmptyData($data._bannerName()) --> 1498 <div class="mega-dropdown-column d-none d-lg-block text-center"> 1499 <img width="100%" data-bind="attr:{ src: GlobalSettingTranslateEnum.PathCategoryPicture + $data._bannerName(), 'alt': $data._code()}" alt="Menu"> 1500 </div> 1501 <!-- /ko --> 1502 </div> 1503 </div> 1504 </li> 1505 </ul> 1506 </li> 1507</ul> 1508<!-- /ko --> 1509<!-- Primary menu--> 1510<ul class="navbar-nav d-none d-lg-flex" data-bind="css:{'hide': m_listCategoryMenuHeader().length==0}, foreach: m_listCategoryMenuHeader"> 1511 <li class="nav-item dropdown"> 1512 <a class="nav-link dropdown-toggle" enable-href="false" href="#" data-bs-auto-close="outside" data-bind="attr:{href: doGetLinkCategory($data)}"> 1513 <span class="categoryColor bolder" data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1514 </a> 1515 <!-- ko if: $data._list().length!=0 --> 1516 <!-- ko run: $data.mode='' --><!-- /ko --> 1517 <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko --> 1518 <!-- /ko --> 1519 </li> 1520</ul> 1521 1522<!-- Tag menu --> 1523<ul class="navbar-nav d-none d-lg-flex ms-auto align-items-center" data-bind="css:{'hide': m_listCategoryMenuTag().length==0}, foreach: m_listCategoryMenuTag"> 1524 <li class="nav-item me-2-Auto"> 1525 <a class="btn btn-sm rounded-pill border px-3 categoryColor" enable-href="false" href="#" data-bind=" 1526 attr:{href: doGetLinkCategory($data), 'data-code': $data._code}, 1527 text: $data._name, 1528 style:{'--data-categoryColor': $data._colorDesktopHex()}"></a> 1529 </li> 1530</ul> 1531<!-- /ko --> 1532 1533<!-- ko if: m_isMenuMobile() --> 1534<aside class="w-100 zindex-lg-5 pt-lg-5 d-lg-none" aria-modal="true" role="dialog"> 1535 <div class="pt-2 d-none d-lg-block"></div> 1536 1537 <!--ko if : m_listCategoryMenuDepartmentHeader().length!=0--> 1538 <ul class="nav nav-tabs nav-justified mt-4 mt-lg-5 mb-0" role="tablist" style="min-height: 3rem;"> 1539 <li class="nav-item" role="presentation"> 1540 <a class="nav-link fw-medium" href="#UI_departments" data-bs-toggle="tab" role="tab" aria-selected="false" tabindex="-1"> 1541 Ø§ÙØ§Ø¯Ø§Ø±Ø§Øª 1542 </a> 1543 </li> 1544 <li class="nav-item" role="presentation"> 1545 <a class="nav-link fw-medium active" href="#UI_headers" data-bs-toggle="tab" role="tab" aria-selected="true"> 1546 ÙØ§Ø¦Ù Ø© 1547 </a> 1548 </li> 1549 </ul> 1550 <!-- /ko --> 1551 1552 <div class="offcanvas-body px-0 pt-3" data-simplebar="init" data-simplebar-auto-hide="false" style="height: calc( 100% - 35px);"> 1553 <div class="tab-content"> 1554 1555 <!--ko if : m_listCategoryMenuDepartmentHeader().length!=0--> 1556 <div class="sidebar-nav tab-pane fade" id="UI_departments" role="tabpanel"> 1557 <div class="widget widget-categories accordion " id="shop-categories" data-bind="foreach: m_listCategoryMenuDepartmentHeader"> 1558 <div class="accordion-item border-bottom accordion-header pe-2-Auto"> 1559 <button class="accordion-button collapsed fw-bold d-flex align-items-center" type="button" data-bs-toggle="collapse" data-bind="attr:{'aria-controls': 'UI_'+$data._id(), 'data-bs-target':'#UI_'+$data._id()}" aria-expanded="false"> 1560 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1561 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1562 </span> 1563 <!-- /ko --> 1564 <span class="categoryColor menuSpan " data-bind="text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorMobileHex()}"></span> 1565 1566 </button> 1567 <!-- ko run: $data.mode='block' --><!-- /ko --> 1568 <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko --> 1569 </div> 1570 </div> 1571 </div> 1572 <!-- /ko --> 1573 1574 <div class="sidebar-nav tab-pane fade active show" id="UI_headers" role="tabpanel"> 1575 <div class="widget widget-categories accordion" data-bind="css:{'hide': m_listCategoryMenuHeader().length==0}, foreach: m_listCategoryMenuHeader"> 1576 <div class="accordion-item accordion-header"> 1577 <button class="categoryBgColor accordion-button collapsed d-flex align-items-center px-1 py-3" style="padding-top: .75rem; padding-bottom: .75rem;" type="button" data-bs-toggle="collapse" data-bind="css:{'hideAfter': $data._list().length==0}, attr:{'aria-controls': 'UI_'+$data._id(), 'data-bs-target':'#UI_'+$data._id()}, style:{'--data-categoryBgColor': $data._colorBackgroundHex()}" aria-expanded="false"> 1578 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1579 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1580 </span> 1581 <!-- /ko --> 1582 <span onclick="" class="categoryColor font-size-18 menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorMobileHex()}"></span> 1583 </button> 1584 1585 <!--ko if : $data._list().length!=0 --> 1586 <!-- ko run: $data.mode='block' --><!-- /ko --> 1587 <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko --> 1588 <!-- /ko --> 1589 1590 </div> 1591 </div> 1592 </div> 1593 1594 </div> 1595 </div> 1596</aside> 1597<!-- /ko --> 1598 1599 1600 </div> 1601 </div> 1602 </div> 1603 1604 </div> 1605</header> 1606 1607 1608 <!-- END HEADER --> 1609 <div style="min-height: 60vh;"> 1610 <div id="UI_AjaxLoader" class="page-wrapper" style="display: none;"> 1611 <div id="UI_LayoutBody" class="main_content"> 1612 1613 1614 1615 1616<link rel="stylesheet" media="print" onload="this.media='all'" href="https://cdn.brandfull.com/cssAccount.min.css?v=639260136226636726">
1617<script type="application/javascript"> 1618 1619 var m_handlerPageCreateSupport; 1620 1621 doLoadScript(function () { 1622 m_handlerPageCreateSupport = new Handler_PageCreateSupport(); 1623 doSetHandlerPageScroller(m_handlerPageCreateSupport); 1624 m_handlerPageCreateSupport.doInitData(); 1625 1626 if (!ko.dataFor(document.getElementById('UI_LayoutBody'))) 1627 ko.applyBindings(m_handlerPageCreateSupport, document.getElementById('UI_LayoutBody')); 1628 1629 1630 1631 // Was the odd one out: maps.google.com rather than maps.googleapis.com, and no 1632 // libraries=places -- a fourth distinct url for the same library. Wrapped rather than passed 1633 // by reference so the initializer is read when Maps is actually ready; Page_About defines a 1634 // window.doInitGoogleMap of its own, and whichever view was swapped in last owns the name. 1635 doLoadGoogleMaps(function () { doInitGoogleMap(); }); 1636 1637 }, "https://cdn.brandfull.com/Handlers/Pages/Handler_PageCreateSupport.js"); 1638 1639 var map; 1640 window.doZoomLocation = function (_latitude, _longitude) { 1641 try { 1642 map.setCenter(new google.maps.LatLng(_latitude, _longitude), 6); 1643 } 1644 catch (error) { 1645 1646 } 1647 } 1648 1649 1650 window.doInitGoogleMap = async function () { 1651 try { 1652 const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); 1653 1654 if (m_handlerPageCreateSupport.m_listAddressModel().length == 0) 1655 return setTimeout(doInitGoogleMap, 1000); 1656 var locations = []; 1657 var location = []; 1658 var isDefault = false; 1659 ko.utils.arrayForEach(m_handlerPageCreateSupport.m_listAddressModel(), function (address) { 1660 try { 1661 if (!isDefault && address._locationModel._latitude() != address._locationModel._longitude()) { 1662 if (address._isDefault()) 1663 isDefault = true; 1664 location = [address._locationModel._latitude(), address._locationModel._longitude()]; 1665 } 1666 1667 if ((parseFloat(address._locationModel._latitude()) + "") == address._locationModel._latitude() && (parseFloat(address._locationModel._longitude()) + "") == address._locationModel._longitude()) 1668 locations.push([address._locationModel._latitude(), address._locationModel._longitude(), address._fullName(), address._email(), address._phone(), address._cityModel._name(), locations.length + 1]); 1669 } 1670 catch (error) { } 1671 }); 1672 1673 if (locations.length != 0) 1674 location = locations[0]; 1675 1676 var mapId = doRandomString(10); 1677 map = new google.maps.Map(document.getElementById('UI_google-map'), { 1678 center: { 1679 lat: parseFloat(location[0], 10), 1680 lng: parseFloat(location[1], 10) 1681 }, 1682 zoom: 12, 1683 mapId: mapId, 1684 mapTypeId: google.maps.MapTypeId.ROADMAP 1685 }); 1686 1687 var infowindow = new google.maps.InfoWindow(); 1688 var marker, i; 1689 for (i = 0; i < locations.length; i++) { 1690 marker = new google.maps.marker.AdvancedMarkerElement({ 1691 position: { 1692 lat: parseFloat(locations[i][0], 10), 1693 lng: parseFloat(locations[i][1], 10) 1694 }, 1695 map: map, 1696 draggable: true 1697 }); 1698 markers.push(marker); 1699 1700 google.maps.event.addListener(marker, 'click', (function (marker, i) { 1701 return function () { 1702 var html = '<div class="textAlignAuto" style="width: 175px;">'; 1703 html += '<b style="text-decoration: underline;">' + locations[i][5] + "</b>"; 1704 html += "<div>👤 <small>" + locations[i][2] + "</small></div>"; 1705 html += "<div>â <small>" + locations[i][3] + "</small></div>"; 1706 html += "<div>â <small>" + locations[i][4] + "</small></div>"; 1707 html += "</div>"; 1708 infowindow.setContent(html); 1709 infowindow.open(map, marker); 1710 } 1711 })(marker, i)); 1712 } 1713 } 1714 catch (error) { 1715 setTimeout(doInitGoogleMap, 1000); 1716 } 1717 } 1718 1719 1720</script>
1720 1721 1722 1723<style> 1724 .addressFooter li { 1725 display: flex; 1726 } 1727 1728 .addressFooter i { 1729 line-height: unset; 1730 } 1731 1732 .addressFooter small { 1733 padding-top: 6px; 1734 } 1735</style> 1736<div class="bg-BreadCrumb pt-4 py-2"> 1737 <div class="container breadcrumbContainer"> 1738 <div class="breadcrumbLink mb-3 "> 1739 <nav aria-label="breadcrumb"> 1740 <ol class="breadcrumb flex-lg-nowrap justify-content-start"> 1741 <li class="breadcrumb-item"><a class="text-nowrap" href="/" enable-href="false"><i class="ci-home"></i>Ø§ÙØµÙØØ© Ø§ÙØ±Ø¦ÙØ³ÙØ©</a></li> 1742 <li class="breadcrumb-item text-nowrap active"> 1743 Ø§ÙØ§ØªØµØ§Ù 1744 </li> 1745 </ol> 1746 </nav> 1747 </div> 1748 <div class="breadcrumbTitle pe-lg-4-Auto "> 1749 <h4 class="h4 text-black mb-0">Ø¹Ø§Ø¦ÙØ© Ø¨Ø±Ø§ÙØ¯ÙÙ ØªÙØªÙ Ø Ù Ø³ÙØ±Ø¯ عÙÙ Ø§Ø³ØªÙØ³Ø§Ø±Ø§ØªÙ ÙÙØ± Ø§Ø³ØªÙØ§Ù ÙØ§</h4> 1750 </div> 1751 </div> 1752</div> 1753 1754 1755<div id="UI_updateDataModalPopUp" class="modal fade" tabindex="-1"> 1756 <div class="modal-dialog modal-dialog-centered" role="document"> 1757 <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg"> 1758 <div class="modal-header border-0 pb-0 px-4 pt-4"> 1759 <h5 class="modal-title fw-bold text-primary mb-0">Ù Ø¯ÙØ´!</h5> 1760 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 1761 </div> 1762 <div class="modal-body text-center px-4 pt-3 pb-4"> 1763 <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle" 1764 style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);"> 1765 <div class="d-inline-flex align-items-center justify-content-center rounded-circle" 1766 style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);"> 1767 <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i> 1768 </div> 1769 </div> 1770 <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">ØªÙ Ø¥Ø±Ø³Ø§Ù ØªØ°ÙØ±ØªÙ.</p> 1771 </div> 1772 </div> 1773 </div> 1774</div> 1775 1776 1777<section class="container"> 1778 <div class="pt-2"> 1779 <!-- Checkout form--> 1780 <div class="row g-0 pb-5 mb-xl-3"> 1781 <!-- Delivery details--> 1782 <div class="col-lg-6 mb-2 bg-secondary px-3 pb-4 bf-formPanel"> 1783 <div class="field_form"> 1784 <form method="post" name="enq"> 1785 <div class="row"> 1786 <div class="col-sm-6 mb-3"> 1787 <label class="form-label" for="UI_name">Ø£Ø¯Ø®Ù Ø§ÙØ§Ø³Ù </label> 1788 <input autocomplete="name" class="form-control" type="text" id="UI_name" required placeholder="" data-bind="value : m_currentTicket._name, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorName())}"> 1789 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorName"></div> 1790 </div> 1791 <div class="col-sm-6 mb-3"> 1792 <label class="form-label" for="UI_email">Ø£Ø¯Ø®Ù Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ</label> 1793 <input autocomplete="email" class="form-control" type="text" id="UI_email" required placeholder="" data-bind="value : m_currentTicket._email, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorEmail())}"> 1794 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorEmail"></div> 1795 </div> 1796 <div class="col-sm-12 mb-3"> 1797 <label class="form-label">ÙÙØ¹ Ø§ÙØ§Ø³ØªÙسار</label> 1798 <select class="form-select" data-bind="options: m_listTicketType, optionsCaption: 'اختر اÙÙÙØ¹',optionsValue: '_id', optionsText: '_name',value : m_currentTicket._ticketTypeModel._id, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorTicketTypeModel())}"> 1799 </select> 1800 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorTicketTypeModel"></div> 1801 </div> 1802 <div class="col-sm-12 mb-3" data-bind="visible: $root.m_currentTicket._ticketTypeModel._isObjectRequired()"> 1803 <label class="form-label" for="UI_objectCode">ر٠ز اÙÙ ÙØªØ¬</label> 1804 <input autocomplete="off" class="form-control" type="text" id="UI_objectCode" required placeholder="" data-bind="value : m_currentTicket._objectModel._code, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorObjectModel())}"> 1805 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorObjectModel"></div> 1806 </div> 1807 <div class="col-sm-12 mb-3" data-bind="visible: $root.m_currentTicket._ticketTypeModel._isInvoiceRequired()"> 1808 <label class="form-label" for="UI_invoiceCode">ر٠ز اÙÙØ§ØªÙرة</label> 1809 <input autocomplete="off" class="form-control" type="text" id="UI_invoiceCode" required placeholder="" data-bind="value : m_currentTicket._invoiceModel._code, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorInvoiceModel())}"> 1810 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorInvoiceModel"></div> 1811 </div> 1812 <div class="col-sm-12 mb-3"> 1813 <label class="form-label" for="UI_title">Ù ÙØ¶Ùع Ø§ÙØ±Ø³Ø§ÙÙ</label> 1814 <input autocomplete="off" class="form-control" type="text" id="UI_title" required placeholder="" data-bind="value : m_currentTicket._title, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorTitle())}"> 1815 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorTitle"></div> 1816 </div> 1817 <div class="col-sm-12 mb-3"> 1818 <label class="form-label" for="UI_message">ÙØµÙ Ø±Ø³Ø§ÙØªÙ</label> 1819 <textarea class="form-control" id="UI_message" placeholder="" rows="4" required data-bind="value : m_currentTicket._description, css:{'is-invalid':!doCheckEmptyData(m_errorTicket.m_errorDescription())}"></textarea> 1820 <div class="invalid-feedback" data-bind="text: m_errorTicket.m_errorDescription"></div> 1821 </div> 1822 <div class="col-md-12 mt-4"> 1823 <button class="btn btn-primary d-block w-100" title="Submit Your Message!" type="submit" data-bind="visible: !m_handlerLayout.m_customLoader(), click : $root.doSaveData.bind($root)">ارسÙ</button> 1824 </div> 1825 <div class="col-md-12"> 1826 <div id="alert-msg" class="alert-msg text-center"></div> 1827 </div> 1828 </div> 1829 <input name="__RequestVerificationToken" type="hidden" value="CfDJ8D-D7EqoUdNAnngGhDAcAjVxcttiWvNzMNzTXc0WSkKm5EjkqxDxG3z2NyPq_wriMJYIyZbPYs0VVkDCqZFG8RQ12Xdd-iArKu4xH-WPDmsBXvyHw152zoaOZ6I3tCNXXc7b1Qt1Tooz5bj9jQPBVUQ" /></form> 1830 </div> 1831 1832 </div> 1833 <div class="col-lg-6 mb-2 px-3"> 1834 1835 <div id="UI_google-map" class="" style="min-height: 400px; height: 100%;"> 1836 </div> 1837 </div> 1838 </div> 1839 </div> 1840</section> 1841 1842 </div> 1843 </div> 1844 </div> 1845 <!-- START FOOTER --> 1846 1847<style> 1848 .codeInput { 1849 width: 32px; 1850 height: 32px; 1851 text-align: center; 1852 border: none; 1853 border-bottom: 1.5px solid #d2d2d2; 1854 margin: 0 10px; 1855 } 1856 1857 .codeInput:focus { 1858 border-bottom: 1.5px solid deepskyblue; 1859 outline: none; 1860 } 1861 1862 /* Shared content modal (#UI_slideModal): the body is Portal-authored HTML, so give the tags an 1863 admin actually types a sane default rather than leaving them at browser sizes. */ 1864 .slideModal-body { 1865 font-size: .9rem; 1866 line-height: 1.7; 1867 color: #374151; 1868 } 1869 1870 .slideModal-body ul, 1871 .slideModal-body ol { 1872 padding-inline-start: 18px; 1873 margin-bottom: 0; 1874 } 1875 1876 .slideModal-body p:last-child { 1877 margin-bottom: 0; 1878 } 1879</style> 1880 1881 1882
1883<!-- Sign in / sign up / forgot Password modal--> 1884<div id="UI_sessionModal" class="modal fade noPadding" tabindex="-1" role="dialog"> 1885 <div class="modal-dialog modal-dialog-centered" role="document"> 1886 <div class="modal-content"> 1887 <div class="modal-header bg-secondary"> 1888 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 1889 <li class="nav-item"><a id="UI_signinTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" href="#signin-tab" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-unlocked me-2-Auto mt-n1"></i>تسجÙÙ Ø§ÙØ¯Ø®ÙÙ</a></li> 1890 <li class="nav-item"><a id="UI_signupTab" data-bind="click : doResetUserError" class="nav-link fw-medium" href="#signup-tab" data-bs-toggle="tab" role="tab" aria-selected="false"><i class="ci-user me-2-Auto mt-n1"></i>Ø§ÙØªØ³Ø¬ÙÙ</a></li> 1891 </ul> 1892 <button class="btn-close adjustBtnClose" style="" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 1893 </div> 1894 <div class="modal-body tab-content py-4"> 1895 <div id="UI_socialAccount" class="py-2"> 1896 <h3 class="d-inline-block align-middle fs-base fw-medium mb-2">٠ع ØØ³Ø§Ø¨ اجت٠اعÙ</h3> 1897 <div class="row"> 1898 <div id="UI_buttonGoogle" class="col-md-6 my-1" style="height: 40px;"></div> 1899 <div id="appleid-signin" class="col-md-6 my-1" style="height: 40px;" data-color="black" data-border="true" data-type="sign in"></div> 1900 </div> 1901 </div> 1902 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate id="signin-tab"> 1903 <div class="mb-3"> 1904 <label class="form-label" for="UI_emailModal">Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙØ§ÙÙØ§ØªÙ</label> 1905 <input autocomplete="username" id="UI_emailModal" data-bind="value : m_currentStructUser._email, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._email()) || !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control" type="email" placeholder="[email protected]" required> 1906 <div data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div> 1907 <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 1908 </div> 1909 <div class="mb-3"> 1910 <label class="form-label" for="UI_passwordModal">ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© بÙ</label> 1911 <div class="password-toggle"> 1912 <input data-bind="value : m_currentStructUser._password, css:{'is-invalid':!doCheckEmptyData(m_errorStructUser._password())}" class="form-control" type="password" id="UI_passwordModal" required autocomplete="current-password"> 1913 <label class="password-toggle-btn" aria-label="Show/hide password"> 1914 <input class="password-toggle-check" type="checkbox"><span class="password-toggle-indicator"></span> 1915 </label> 1916 </div> 1917 <div data-bind="style:{display:!doCheckEmptyData(m_errorStructUser._password())?'block':'none'} , text: m_errorStructUser._password" class="invalid-feedback"></div> 1918 </div> 1919 <div class="mb-3 d-flex flex-wrap justify-content-between"> 1920 <div class="mb-2" data-bind="class:'ar' == 'en'? 'form-check':'form-check-reverse'"> 1921 </div> 1922 <a class="fs-sm" href="#" onclick="doShowModal('UI_forgotModal');" data-bs-dismiss="modal" aria-label="Close">ÙÙ ÙØ³Ùت ÙÙÙ Ø© اÙÙ Ø±ÙØ±Ø</a> 1923 </div> 1924 <button data-bind="click : doSignUser" class="btn btn-primary btn-shadow d-block w-100" type="button">تسجÙÙ Ø§ÙØ¯Ø®ÙÙ</button> 1925 </form> 1926 1927 <form class="needs-validation tab-pane fade" autocomplete="off" novalidate id="signup-tab" novalidate> 1928 <p class="list-unstyled fs-md"> 1929 Ø£Ø¶Ù Ø¨Ø±ÙØ¯Ù Ø§ÙØ¥ÙÙØªØ±ÙÙÙ Ø£Ù ÙØ§ØªÙÙ Ø£Ø¯ÙØ§Ù Ø ÙØ³ÙØªÙ Ø¥Ø±Ø³Ø§Ù Ø±Ø³Ø§ÙØ© ÙÙØªØÙÙ. 1930 </p> 1931 <div class="mt-4 bg-white"> 1932 <div class="mb-3"> 1933 <div class="d-flex justify-content-between"> 1934 <div class="col-8"> 1935 <input autocomplete="tel" id="UI_quickPhoneInput" data-bind="value : m_currentStructUser._phone,valueUpdate: ['afterkeydown', 'input'], css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control " type="tel" lang=ar dir=rtl placeholder="رÙ٠اÙÙØ§ØªÙ" required> 1936 1937 <!-- ko if: !doCheckEmptyData(m_errorStructUser._phone()) --> 1938 <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 1939 <!-- /ko --> 1940 </div> 1941 <div class="col-3"> 1942 <select class="form-select" id="UI_quickCountry" data-bind="css:{'is-invalid':!doCheckEmptyData(m_errorUser.m_errorCountryModel())}, options: m_listCountry, value: m_currentUser._countryModel._id,optionsText: '_code', optionsValue: '_id'"> 1943 </select> 1944 </div> 1945 </div> 1946 <div class="d-flex text-center my-4 align-items-center"> 1947 <hr class="w-25 mx-auto">
1948 <span class="h6">Ø£Ù</span> 1949 <hr class="w-25 mx-auto"> 1950 </div> 1951 <input autocomplete="email" data-bind="value : m_currentStructUser._email, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._email())}" class="form-control" type="email" placeholder="[email protected]" required> 1952 <!-- ko if: !doCheckEmptyData(m_errorStructUser._email()) --> 1953 <div id="UI_errorEmailModal" data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div> 1954 <!-- /ko --> 1955 </div> 1956 <div class=" mb-3" data-bind="class:'ar' == 'en'? 'form-check':'form-check-reverse'"> 1957 <input class="form-check-input" type="checkbox" id="UI_agreePage" value="" data-bind="attr:{checked: m_isAgree()}, value: m_isAgree(),click: $root.doSetAgree.bind($root)"> 1958 <label class="form-check-label" for="UI_agreePage"> 1959 <span>Ø£ÙØ§Ù٠عÙÙ Ø§ÙØ´Ø±ÙØ· ÙØ§ÙØ³ÙØ§Ø³Ø©</span> 1960 </label> 1961 1962 <a href="/About/TermsandCondition" target="_blank" enable-href="true" class="readMore">Ø§ÙØ±Ø£</a> 1963 </div> 1964 <!-- ko if: m_isAgree() --> 1965 <button data-bind="click : $root.doForgetPassword.bind($root, true)" class="btn btn-primary w-100" type="button">Ø§Ø±Ø³Ù Ø§ÙØ±Ù ز</button> 1966 <!-- /ko --> 1967 1968 </div> 1969 </form> 1970 1971 1972 1973 </div> 1974 </div> 1975 </div> 1976</div> 1977 1978 1979<div id="UI_forgotModal" class="modal fade" tabindex="-1" role="dialog"> 1980 <div class="modal-dialog modal-dialog-centered" role="document"> 1981 <div class="modal-content"> 1982 <div class="modal-header bg-secondary"> 1983 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 1984 <li class="nav-item"><a id="UI_signinTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-help me-2-Auto mt-n1"></i>ÙØ³Ùت ÙÙÙ Ø© اÙÙ Ø±ÙØ±</a></li> 1985 </ul> 1986 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 1987 </div> 1988 <div class="modal-body tab-content py-4"> 1989 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate> 1990 <p class="fs-md">Ù٠بتغÙÙØ± ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© ب٠ÙÙ Ø«ÙØ§Ø« Ø®Ø·ÙØ§Øª سÙÙØ©. ÙØ³Ø§Ø¹Ø¯ ÙØ°Ø§ ÙÙ Ø§ÙØÙØ§Ø¸ عÙ٠أ٠ا٠ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ¬Ø¯Ùدة.</p> 1991 <ol class="list-unstyled fs-md"> 1992 <li><span class="text-primary me-2-Auto">1.</span>Ø§Ù ÙØ£ عÙÙØ§Ù Ø¨Ø±ÙØ¯Ù Ø§ÙØ¥ÙÙØªØ±ÙÙÙ Ø£Ø¯ÙØ§Ù.</li> 1993 <li><span class="text-primary me-2-Auto">2.</span>Ø³ÙØ±Ø³Ù Ø¥ÙÙ٠ر٠زا Ù Ø¤ÙØªØ§ عبر Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ.</li> 1994 <li><span class="text-primary me-2-Auto">3.</span>Ø§Ø³ØªØ®Ø¯Ù Ø§ÙØ±Ù ز ÙØªØºÙÙØ± ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© ب٠عÙÙ Ù ÙÙØ¹Ùا Ø§ÙØ¢Ù Ù.</li> 1995 </ol> 1996 <div class="py-2 mt-4"> 1997 <div class="mb-3"> 1998 <input autocomplete="email" id="UI_popuEmailInput" data-bind="value : m_currentStructUser._email, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._email()) || !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control" type="email" placeholder="[email protected]" required> 1999 <!-- ko if: !doCheckEmptyData(m_errorStructUser._email()) --> 2000 <div data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div> 2001 <!-- /ko --> 2002 <div class="d-flex text-center my-4 align-items-center"> 2003 <hr class="w-25 mx-auto">
2004 <span class="h6">Ø£Ù</span> 2005 <hr class="w-25 mx-auto"> 2006 </div> 2007 <div class="d-flex justify-content-between"> 2008 <div class="col-8"> 2009 <input autocomplete="tel" id="UI_popuPhoneInput" data-bind="value : m_currentStructUser._phone, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._phone()) || !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control " type="number" placeholder="رÙ٠اÙÙØ§ØªÙ" required> 2010 2011 </div> 2012 <div class="col-3"> 2013 <select class="form-select" id="UI_popupCountry" data-bind="css:{'is-invalid':!doCheckEmptyData(m_errorUser.m_errorCountryModel())}, options: m_listCountry, value: m_currentUser._countryModel._id,optionsText: '_code', optionsValue: '_id'"> 2014 </select> 2015 </div> 2016 </div> 2017 <!-- ko if: !doCheckEmptyData(m_errorStructUser._phone()) --> 2018 <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 2019 <!-- /ko --> 2020 </div> 2021 <button data-bind="click : $root.doForgetPassword.bind($root, false)" class="btn btn-primary w-100" type="button" data-bs-dismiss="modal" aria-label="Close">Ø§Ø±Ø³Ù Ø§ÙØ±Ù ز</button> 2022 </div> 2023 </form> 2024 </div> 2025 </div> 2026 </div> 2027</div> 2028 2029 2030<div id="UI_validationModal" class="modal fade" tabindex="-1" role="dialog"> 2031 <div class="modal-dialog modal-dialog-centered" role="document"> 2032 <div class="modal-content"> 2033 <div class="modal-header bg-secondary"> 2034 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 2035 <li class="nav-item"><a id="UI_validationTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-key me-2-Auto mt-n1"></i>ÙÙÙ Ø© Ù Ø±ÙØ± Ø§ÙØªØÙÙ Ù Ù Ø§ÙØµØØ©</a></li> 2036 </ul> 2037 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 2038 </div> 2039 <div class="modal-body tab-content py-4"> 2040 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate> 2041 <!-- ko if: !doCheckEmptyData(m_currentStructUser._email()) --> 2042 <p class="fs-md" data-bind="text: 'ÙØ±Ø¬Ù Ø§ÙØªØÙÙ Ù Ù Ø¨Ø±ÙØ¯Ù Ø§ÙØ¥ÙÙØªØ±ÙÙÙ' + ': (' + m_currentStructUser._email() + ')' "></p> 2043 <!-- /ko --> 2044 <!-- ko if: !doCheckEmptyData(m_currentStructUser._phone()) --> 2045 <p class="fs-md" data-bind="text: 'ÙØ±Ø¬Ù Ø§ÙØªØÙ٠٠٠رÙÙ ÙØ§ØªÙÙ' + ': (' + m_currentStructUser._phone() + ')' "></p> 2046 <!-- /ko --> 2047 <div class="mb-3"> 2048 <label class="form-label">Ø£Ø¯Ø®Ù Ø§ÙØ±Ù ز Ø§ÙØ®Ø§Øµ بÙ</label> 2049 <div class="form-control d-flex align-items-center justify-content-center" dir="ltr" id='UI_sessionCodeInputs' data-bind=" css:{'is-invalid': !m_isVerifyed()}"> 2050 <input class="codeInput" id="UI_sessionCode1" type="text" inputmode="numeric" maxlength="1" autocomplete="one-time-code" /> 2051 <input class="codeInput" id="UI_sessionCode2" type="text" inputmode="numeric" maxlength="1" /> 2052 <input class="codeInput" id="UI_sessionCode3" type="text" inputmode="numeric" maxlength="1" /> 2053 <input class="codeInput" id="UI_sessionCode4" type="text" inputmode="numeric" maxlength="1" /> 2054 </div> 2055 <!-- ko if: !doCheckEmptyData(m_errorStructUser._code()) --> 2056 <div id="UI_errorCodeModal" data-bind="text: m_errorStructUser._code" class="invalid-feedback"></div> 2057 <!-- /ko --> 2058 <!-- ko if: !doCheckEmptyData(m_errorStructUser._phone) --> 2059 <div id="UI_errorPhoneModal" data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 2060 <!-- /ko --> 2061 </div> 2062 <div class="text-center py-2 px-3" style=" display: flow-root;"> 2063 <button class="btn btn-sm btn-primary col-md-6" data-bind="click : $root.doSendCode.bind($root)" type="button">إرساÙ</button> 2064 </div> 2065 </form> 2066 </div> 2067 </div> 2068 </div> 2069</div> 2070 2071 2072<div id="UI_resetPasswordModal" class="modal fade" tabindex="-1" role="dialog"> 2073 <div class="modal-dialog modal-dialog-centered" role="document"> 2074 <div class="modal-content"> 2075 <div class="modal-header bg-secondary"> 2076 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 2077 <li class="nav-item"><a id="UI_resetPasswordTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-key me-2-Auto mt-n1"></i>إعادة تعÙÙÙ ÙÙÙ Ø© اÙÙ Ø±ÙØ±</a></li> 2078 </ul> 2079 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 2080 </div> 2081 <div class="modal-body tab-content py-4"> 2082 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate> 2083 <p>ÙÙ ÙÙ٠تغÙÙØ± ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© Ø¨Ù ÙØ£Ø³Ø¨Ø§Ø¨ Ø£Ù ÙÙØ© أ٠إعادة تعÙÙÙÙØ§ إذا ÙØ³ÙØªÙØ§.</p> 2084 <!-- ko if: !doCheckEmptyData(m_errorStructUser._token()) --> 2085 <div id="UI_errorToken" data-bind="text: m_errorStructUser._token" class="invalid-feedback"></div> 2086 <!-- /ko --> 2087 <!-- ko if: m_isSuccess()--> 2088 <p>ØªÙ ØªØØ¯ÙØ« ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© بÙ</p> 2089 <!-- /ko --> 2090 <!-- ko if : !m_isSuccess() --> 2091 <input class="d-none" type="text" autocomplete="username" tabindex="-1" aria-hidden="true" data-bind="value: m_currentStructUser._email"> 2092 <div class="mb-3"> 2093 <label class="form-label" for="UI_resetPasswordH
2093ashModal">ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© بÙ</label> 2094 <input class="form-control" type="password" data-bind="value : m_currentStructUser._password, css:{'is-invalid':!doCheckEmptyData(m_errorStructUser._password())}" id="UI_resetPasswordHashModal" required autocomplete="new-password"> 2095 <div id="UI_errorPasswordModal" data-bind="text: m_errorStructUser._password" class="invalid-feedback"></div> 2096 </div> 2097 <div class="mb-3"> 2098 <label class="form-label" for="UI_resetConfirmPasswordModal">تأÙÙØ¯ ÙÙÙ Ø© اÙÙ Ø±ÙØ±</label> 2099 <input data-bind="value : m_currentStructUser._confirmation, css:{'is-invalid':!doCheckEmptyData(m_errorStructUser._confirmation())}" id="UI_resetConfirmPasswordModal" class="form-control" type="password" required autocomplete="new-password"> 2100 <div id="UI_errorConfirmPasswordModal" data-bind="text: m_errorStructUser._confirmation" class="invalid-feedback"></div> 2101 </div> 2102 <!-- /ko --> 2103 <button data-bind="click: $root.doUpdatePassword.bind($root)" class="btn btn-primary btn-shadow d-block w-100" type="button">ØÙظ</button> 2104 </form> 2105 </div> 2106 </div> 2107 </div> 2108</div> 2109 2110 2111<div id="UI_successRegisterModalPopUp" class="modal fade" tabindex="-1"> 2112 <div class="modal-dialog modal-dialog-centered" role="document"> 2113 <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg"> 2114 <div class="modal-header border-0 pb-0 px-4 pt-4"> 2115 <h5 class="modal-title fw-bold text-primary mb-0">تسجÙÙ!</h5> 2116 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 2117 </div> 2118 <div class="modal-body text-center px-4 pt-3 pb-4"> 2119 <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle" 2120 style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);"> 2121 <div class="d-inline-flex align-items-center justify-content-center rounded-circle" 2122 style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);"> 2123 <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i> 2124 </div> 2125 </div> 2126 <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">ت٠تأÙÙØ¯ Ø¨ÙØ§ÙاتÙ.</p> 2127 </div> 2128 </div> 2129 </div> 2130</div> 2131 2132<div id="UI_popUpNewsLetterSubmit" class="modal fade" tabindex="-1"> 2133 <div class="modal-dialog modal-dialog-centered" role="document"> 2134 <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg"> 2135 <div class="modal-header border-0 pb-0 px-4 pt-4"> 2136 <h5 class="modal-title fw-bold text-primary mb-0">Ø§ÙØ±Ø³Ø§ÙÙ Ø§ÙØ§Ø®Ø¨Ø§Ø±ÙÙ!</h5> 2137 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 2138 </div> 2139 <div class="modal-body text-center px-4 pt-3 pb-4"> 2140 <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle" 2141 style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);"> 2142 <div class="d-inline-flex align-items-center justify-content-center rounded-circle" 2143 style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);"> 2144 <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i> 2145 </div> 2146 </div> 2147 <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">ت٠ØÙظ Ø¬ÙØ© Ø§ÙØ§ØªØµØ§Ù.</p> 2148 </div> 2149 </div> 2150 </div> 2151</div> 2152 2153 2154<div id="UI_slideModal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2155 <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" role="document"> 2156 <div class="modal-content"> 2157 <div class="modal-header bg-secondary"> 2158 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 2159 <li class="nav-item"><a class="nav-link fw-medium active" role="tab" aria-selected="true"><i class="ci-announcement me-2-Auto mt-n1"></i><span data-bind="text: m_currentSlideModal._title"></span></a></li> 2160 </ul> 2161 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 2162 </div> 2163 <div class="modal-body py-4"> 2164 <div class="slideModal-body textAlignAuto" data-bind="html: m_currentSlideModal._description"></div> 2165 2166 <!-- ko ifnot: doCheckEmptyData(m_currentSlideModal._link()) --> 2167 <a class="btn btn-primary d-block w-100 mt-3" href="#" enable-href="true" data-bind="attr:{href: m_currentSlideModal._link}"> 2168 <!-- ko if: doCheckEmptyData(m_currentSlideModal._button()) -->Ø£ÙØ«Ø±<!-- /ko --> 2169 <!-- ko ifnot: doCheckEmptyData(m_currentSlideModal._button()) --><span data-bind="text: m_currentSlideModal._button"></span><!-- /ko --> 2170 </a> 2171 <!-- /ko --> 2172 </div> 2173 </div> 2174 </div> 2175</div> 2176 2177 2178<!-- Cart Drawer Backdrop --> 2179<div id="UI_cartDrawerBackdrop" class="cart-drawer-backdrop" style="display:none" 2180 data-bind="visible: m_currentPopUpMessage._isVisible(), click: doCloseCartDrawer"></div> 2181 2182<!-- Cart Drawer --> 2183<div id="UI_cartDrawer" class="cart-drawer" 2184 data-bind="css: { 'cart-drawer-open': m_currentPopUpMessage._isVisible(), 'cart-drawer-short': m_drawerShortMode(), 'cart-drawer-alert-only': m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0 }"> 2185 2186 <!-- Drawer Header --> 2187 <!-- ko if: !(m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0) --> 2188 <div class="cart-drawer-header"> 2189 <h5 class="mb-0 fw-bold"> 2190 عربة Ø§ÙØªØ³ÙÙ 2191 </h5> 2192 <button class="btn-close" type="button" aria-label="Close" data-bind="click: doCloseCartDrawer"></button> 2193 </div> 2194 <!-- /ko --> 2195 2196 <!-- Added Item Notification --> 2197 <!-- ko if: m_currentPopUpMessage._popUpMessageType() >= 0 --> 2198 <div class="cart-drawer-alert" data-bind="css: doGetClassDrawerAlert()"> 2199 <div class="d-flex align-items-center gap-2"> 2200 <!-- ko if: m_currentPopUpMessage._pictureUrl() && !(m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 0) --> 2201 <img alt="" loading="lazy" class="rounded flex-shrink-0" style="width:40px; height:40px; object-fit:cover;" data-bind="attr:{ src: m_currentPopUpMessage._pictureUrl() }"> 2202 <!-- /ko --> 2203 <div class="flex-grow-1 font-size-12" data-bind="html: doGetDrawerAlertMessage()"></div> 2204 <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0 --> 2205 <button class="btn-close flex-shrink-0" type="button" style="font-size: 10px;" aria-label="Close" data-bind="click: doCloseCartDrawer"></button> 2206 <!-- /ko --> 2207 </div> 2208 <!-- ko if: m_currentPopUpMessage._hasCouponShipment() --> 2209 <div class="shipteaser shipteaser-sm mt-2" data-bind="css: { 'shipteaser-done': !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() == 100 }" > 2210 <span class="shipteaser-icon"><i class="ci-delivery flipAuto"></i></span> 2211 <div class="shipteaser-body"> 2212 <!-- ko if: m_currentPopUpMessage._hasPartialShipmentDiscount() --> 2213 <p class="shipteaser-text" data-bind="html: doGetShipmentTeaserMessage()"></p> 2214 <!-- /ko --> 2215 2216 <!-- ko if: !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() != 100 --> 2217 <p class="shipteaser-text">شراء <span class="shipteaser-value" data-bind="text: m_currentPopUpMessage._couponAmount()"></span> <span class="shipteaser-value" data-bind="text: doGetCurrentCurrency()"></span> اÙÙ Ø²ÙØ¯ ÙÙØØµÙ٠عÙÙÙ <strong>Ø´ØÙ ٠جاÙÙ</strong></p> 2218 <!-- /ko --> 2219 2220 <!-- ko if: !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() == 100 --> 2221 <p class="shipteaser-text">خد٠ة Ø§ÙØ´ØÙ اÙ٠جاÙÙ</p> 2222 <!-- /ko --> 2223 2224 <!-- ko if: m_currentPopUpMessage._drawLine() != 100 --> 2225 <div class="shipteaser-track" role="progressbar" aria-label="Free shipping progress"> 2226 <div class="shipteaser-fill" data-bind="style:{'width': m_currentPopUpMessage._drawLine()+'%'}"></div> 2227 </div> 2228 <!-- /ko --> 2229 </div> 2230 </div> 2231 <!-- /ko --> 2232 </div> 2233 <!-- /ko --> 2234 2235 <!-- Drawer Body - Cart Items --> 2236 <div class="cart-drawer-body"> 2237 <!-- ko if: m_currentCart._listCartDetailModel().length != 0 --> 2238 <div data-bind="foreach: { data: m_showCartDrawer() ? doGetFilterCart() : [] }"> 2239 <div class="cart-drawer-item"> 2240 <div class="d-flex gap-2 align-items-start"> 2241 <div class="flex-shrink-0 position-relative"> 2242 <a class="cart-drawer-item-img d-block" enable-href="false" data-bind="attr:{href: doGetLinkObject($data._objectModel)}"> 2243 <img loading="lazy" data-bind="attr:{ src: doGetDefaultPictureByObject($data._objectModel, true), alt: $data._objectModel._name }"> 2244 </a> 2245 <button class="cart-drawer-item-remove" 2246 data-bind="click: $root.doRemoveCartDetail.bind($root, $data)" 2247 type="button" aria-label="Remove"> 2248 <i class="ci-trash"></i> 2249 </button> 2250 </div> 2251 <div class="flex-grow-1" style="min-width:0;"> 2252 <a enable-href="true" class="cart-drawer-item-title" data-bind="text: $data._objectModel._name, attr:{href: doGetLinkObject($data._objectModel)}"></a> 2253 <div class="d-flex justify-content-between align-items-center mt-1"> 2254 <div class="text-accent fw-bold" data-bind="html: $root.doGetHtmlCartDetailPrice($data, true, true)"></div> 2255 <!-- ko if: $data._cartDetailType() != CartDetailTypeEnum.FromBundle --> 2256 <!-- ko if: $data._objectModel._objectSection() != ObjectSectionEnum.GiftCard && $data._objectModel._objectSection() != ObjectSectionEnum.Service --> 2257 <div class="count-input count-input-xs rounded-pill flex-shrink-0"> 2258 <button type="button" class="btn btn-icon" data-bind="click: $root.doSetQuantity.bind($root, $data, QuantityActionEnum.Remove)">
2259 <span class="fw-bold">â</span> 2260 </button> 2261 <input autocomplete="off" type="number" class="form-control text-center" readonly="true" data-bind="value: $data._quantity"> 2262 <button type="button" class="btn btn-icon" data-bind="click: $root.doSetQuantity.bind($root, $data, QuantityActionEnum.Add)"> 2263 <span class="fw-bold">+</span> 2264 </button> 2265 </div> 2266 <!-- /ko --> 2267 <!-- /ko --> 2268 </div> 2269 <!-- ko if: $data._objectModel._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.Preserved --> 2270 <div class="cart-drawer-item-preorder d-flex align-items-center mt-1"> 2271 <i class="ci-truck flipAuto me-1-Auto" data-bind="css:{'icon-flip-horizontal': doGetCulture() =='en'}"></i> 2272 <!-- ko if: doGetCountryShortNameByCurrentCompany() == 'sa' --> 2273 <span data-bind="text: doFormatPreserved($data._objectModel._objectStockModel._datePreserved(), 15, doGetCulture())"></span> 2274 <!-- /ko --> 2275 <!-- ko if: doGetCountryShortNameByCurrentCompany() == 'ae' --> 2276 <span data-bind="text: doFormatPreserved($data._objectModel._objectStockModel._datePreserved(), 7, doGetCulture())"></span> 2277 <!-- /ko --> 2278 </div> 2279 <!-- /ko --> 2280 </div> 2281 </div> 2282 </div> 2283 </div> 2284 <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 1 --> 2285 <div class="text-center py-2 border-top"> 2286 <button type="button" class="btn btn-link p-0 text-decoration-none fw-semibold font-size-12" 2287 style="color: rgba(var(--cz-primary-rgb));" 2288 data-bind="click: function(){ m_drawerShortMode(false); }, text: 'عرض Ø§ÙØ¬Ù ÙØ¹ ' + doGetCartCount() + ' اÙÙ ÙØªØ¬Ø§Øª'"> 2289 </button> 2290 </div> 2291 <!-- /ko --> 2292 <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 0 --> 2293 <div class="px-3 pb-2"> 2294 <a class="btn btn-sm d-block w-100 cart-drawer-checkout" 2295 href="/Checkout" enable-href="false" 2296 onclick="m_handlerSession.doCloseCartDrawer()" 2297 style="font-size: 12px; padding: 6px 12px;"> 2298 <i class="ci-card me-2-Auto fs-sm align-middle flipAuto"></i>Ø§ÙØ¯Ùع 2299 </a> 2300 </div> 2301 <!-- /ko --> 2302 <!-- /ko --> 2303 2304 <!-- ko if: m_currentCart._listCartDetailModel().length == 0 && !m_drawerShortMode() --> 2305 <div class="text-center py-5 px-3"> 2306 <i class="ci-card-bag" style="font-size:48px; color:#ccc;"></i> 2307 <h6 class="mt-3 text-muted">ÙØ§ ØªÙØ¬Ø¯ Ù ÙØªØ¬Ø§Øª ÙÙ Ø³ÙØ© Ø§ÙØªØ³ÙÙ Ø§ÙØ®Ø§ØµØ© بÙ.</h6> 2308 </div> 2309 <!-- /ko --> 2310 </div> 2311 2312 <!-- Drawer Footer --> 2313 <!-- ko if: m_currentCart._listCartDetailModel().length != 0 && !m_drawerShortMode() --> 2314 <div class="cart-drawer-footer pb-sm-5 pb-md-4"> 2315 <div class="d-flex justify-content-between align-items-start mb-3"> 2316 <div class="textAlignAuto"> 2317 <span class="text-accent fw-semibold">Ù Ø¬Ù ÙØ¹</span> 2318 <span class="text-muted font-size-10">(ØªØ´Ù Ù Ø¶Ø±ÙØ¨Ø© اÙÙÙÙ Ø© اÙÙ Ø¶Ø§ÙØ©)</span> 2319 <div class="fs-lg fw-bold" style="color: var(--cz-heading-color, #222);" data-bind="html: $root.doCalcPriceDynamic(m_currentCart._total(), true)"></div> 2320 </div> 2321 <!-- ko if: doGetCartTotalSaved() > 0 --> 2322 <div class="font-size-11 text-success fw-semibold textAlignAuto" style="margin-top: 4px;"> 2323 <i class="ci-star font-size-10"></i> ÙÙØ¯ Ø£ÙÙØ°Øª 2324 <div class="fs-sm fw-bold" data-bind="html: $root.doCalcPriceDynamic(doGetCartTotalSaved(), true)"></div> 2325 </div> 2326 <!-- /ko --> 2327 </div>
2328 <a class="btn d-block w-100 cart-drawer-checkout mb-2" href="/Checkout" enable-href="false" onclick="m_handlerSession.doCloseCartDrawer()"> 2329 <i class="ci-card me-2-Auto fs-base align-middle flipAuto"></i>Ø§ÙØ¯Ùع 2330 </a> 2331 </div> 2332 <!-- /ko --> 2333</div> 2334 2335 2336 2337 2338
2339<script type="application/javascript"> 2340 window.doRedirection = function () { 2341 if (window.location.pathname.indexOf("CreateSell") != -1) 2342 window.location = window.location.origin; 2343 } 2344 2345 // The notification dropdown renders a row per advertisement, and it is in the header of every 2346 // page â so the whole list was bound on every page load for a panel most visitors never open. 2347 // The markup only foreaches once this says so; the flag stays true afterwards, since a second 2348 // open should cost nothing. 2349 // 2350 // Filling it is deliberately separate from opening it. On desktop the panel is opened by CSS 2351 // alone (.dropdown:hover > .dropdown-menu in StyleCartzilla-Menu.css), which no click handler 2352 // ever sees â so hovering showed the panel with nothing in it. The wrapper calls this on 2353 // pointer enter, which is the earliest moment either path can start. 2354 window.doPrepareAdvertisement = function () { 2355 if (typeof m_handlerSession != "undefined") 2356 m_handlerSession.m_showAdvertisement(true); 2357 } 2358 2359 window.doOpenAdvertisement = function () { 2360 doPrepareAdvertisement(); 2361 doJsShowMenu('UI_menuWebAdvertisement'); 2362 } 2363 2364 // Mobile renders its own copy of the same list, inside a modal opened from the footer 2365 // toolbar. Same gate, same flag: the rows exist once either surface is asked for. 2366 window.doOpenAdvertisementModal = function () { 2367 doPrepareAdvertisement(); 2368 doShowModal('UI_userModalAdvertisement'); 2369 } 2370 2371 window.doOpenProfile = function () { 2372 if (doCheckUUID(m_handlerSession.m_currentUser._id())){ 2373 if(window.innerWidth <= 992) 2374 doShowModal('UI_menuUserMobile'); 2375 else { 2376 var el = document.querySelector('#UI_userSession .dropdown-menu'); 2377 if (el) el.classList.toggle('show'); 2378 } 2379 } 2380 else { 2381 doShowModal('UI_sessionModal'); 2382 } 2383 } 2384 2385 2386 doLoadScript(function () { 2387 doJsPasswordVisibilityToggle(); // wire modal password eye toggles (login/register/reset) 2388 const sessionInputs = ["UI_sessionCode1", "UI_sessionCode2", "UI_sessionCode3", "UI_sessionCode4"]; 2389 doInitCodeInput(sessionInputs, m_handlerSession.m_currentStructUser._code, m_handlerSession, m_handlerSession.doEventSendCode); 2390 2391 var googleClientID = '316328785783-gk72dnq33tchhr0kdrtidg7enq1arami.apps.googleusercontent.com'; 2392 var googleBtn = document.getElementById("UI_buttonGoogle"); 2393 if (googleClientID != "" && googleBtn) { 2394 if (window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth) 2395 { 2396 googleBtn.innerHTML = 2397 '<button class="btn btn-outline-dark w-100">Sign in with Google</button>'; 2398 googleBtn.onclick = async function () { 2399 try { 2400 // Native plugin reads serverClientId from google-services.json / 2401 // GoogleService-Info.plist; web doesn't need to pass it. 2402 var res = await window.Capacitor.Plugins.NativeAuth.signInWithGoogle({}); 2403 m_handlerSession.doGoogleCredentialResponse({ credential: res.idToken }); 2404 } catch (error) { 2405 console.log(error); 2406 } 2407 }; 2408 } 2409 // Web (browser) Google Sign-In client is heavy (~69 KiB). Don't load it at 2410 // page load â defer to the first time the session modal opens. See 2411 // window.doInitGoogleSignIn + the shown.bs.modal listener below. 2412 } 2413 2414 var m_gsiLoaded = false; 2415 window.doInitGoogleSignIn = function () { 2416 if (m_gsiLoaded) 2417 return; 2418 2419 var googleClientID = '316328785783-gk72dnq33tchhr0kdrtidg7enq1arami.apps.googleusercontent.com'; 2420 var googleBtn = document.getElementById("UI_buttonGoogle"); 2421 var isNative = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth; 2422 2423 // Native wires googleBtn.onclick at page load and loads no web script â skip here. 2424 if (googleClientID == "" || !googleBtn || isNative) 2425 return; 2426 2427 m_gsiLoaded = true; 2428 doLoadScript(function () { 2429 try{ 2430 google.accounts.id.initialize({ 2431 client_id: googleClientID, 2432 callback: m_handlerSession.doGoogleCredentialResponse 2433 }); 2434 google.accounts.id.renderButton( 2435 googleBtn, 2436 { theme: "outline", size: "large" } // customization attributes 2437 ); 2438 } 2439 catch(error){ 2440 console.log(error); 2441 } 2442 2443 }, "https://accounts.google.com/gsi/client"); 2444 }; 2445 2446 // The Google and Apple origins used to be preconnected from the head of every page, where 2447 // they were two handshakes nobody spent on a visit that never opens this modal. Warm them 2448 // here instead, on `show` rather than `shown`: the two doInit* handlers below fetch the SDKs 2449 // on `shown`, so this puts the connection one modal fade (~150-300 ms) ahead of the request 2450 // instead of in the same tick, which is the whole point of a preconnect.
2451 var m_signInWarmed = false; 2452 function doWarmSignInOrigins() { 2453 if (m_signInWarmed) 2454 return; 2455 m_signInWarmed = true; 2456 2457 var origins = ["https://accounts.google.com", "https://appleid.cdn-apple.com"]; 2458 for (var w = 0; w < origins.length; w++) { 2459 var hint = document.createElement("link"); 2460 hint.rel = "preconnect"; 2461 hint.href = origins[w]; 2462 hint.crossOrigin = "anonymous"; 2463 document.head.appendChild(hint); 2464 } 2465 } 2466 2467 var sessionModalEl = document.getElementById("UI_sessionModal"); 2468 if (sessionModalEl) 2469 sessionModalEl.addEventListener("show.bs.modal", doWarmSignInOrigins); 2470 if (sessionModalEl) 2471 sessionModalEl.addEventListener("shown.bs.modal", window.doInitGoogleSignIn); 2472 2473 var appleClientID = 'com.root.login.brandfull'; 2474 var appleBtn = document.getElementById("appleid-signin"); 2475 if (appleClientID != "" && appleBtn) { 2476 var capPlatform = (window.Capacitor && window.Capacitor.getPlatform) ? window.Capacitor.getPlatform() : ""; 2477 var isNative = (capPlatform === "ios" || capPlatform === "android") 2478 && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth; 2479 2480 if (isNative) { 2481 // iOS: ASAuthorization (bundle ID is the audience â pass {}). 2482 // Android: Custom Tab to appleid.apple.com, deep-link back via the 2483 // intent-filter on blendshome.com/auth/android. 2484 appleBtn.innerHTML = 2485 '<button class="btn btn-dark w-100">Sign in with Apple</button>'; 2486 appleBtn.onclick = async function () { 2487 try { 2488 var args = (capPlatform === "android") 2489 ? { clientId: appleClientID, redirectUri: 'https://brandfull.com/auth/android' } 2490 : {}; 2491 var res = await window.Capacitor.Plugins.NativeAuth.signInWithApple(args); 2492 m_handlerSession.doAppleCredentialResponse(res.idToken); 2493 } catch (error) { 2494 console.log(error); 2495 } 2496 }; 2497 } 2498 // Web Apple Sign-In JS deferred to first modal open â see window.doInitAppleSignIn. 2499 } 2500 2501 var m_appleLoaded = false; 2502 window.doInitAppleSignIn = function () { 2503 if (m_appleLoaded) 2504 return; 2505 2506 var appleClientID = 'com.root.login.brandfull'; 2507 var appleBtn = document.getElementById("appleid-signin"); 2508 var capPlatform = (window.Capacitor && window.Capacitor.getPlatform) ? window.Capacitor.getPlatform() : ""; 2509 var isNative = (capPlatform === "ios" || capPlatform === "android") 2510 && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth; 2511 2512 // Native wires appleBtn.onclick at page load and loads no web script â skip here. 2513 if (appleClientID == "" || !appleBtn || isNative) 2514 return; 2515 2516 m_appleLoaded = true; 2517 doLoadScript(function () { 2518 2519 AppleID.auth.init({ 2520 clientId: appleClientID, 2521 redirectURI: 'https://brandfull.com', 2522 scope: 'name email', 2523 usePopup: true, 2524 onSuccess: (response) => console.log('responseApple - response', response), 2525 onError: (error) => console.log('responseApple - error', error), 2526 }); 2527 2528 document.addEventListener('AppleIDSignInOnSuccess', (event) => { 2529 // Handle successful response. 2530 console.log('AppleIDSignInOnSuccess', event.detail.authorization.id_token); 2531 m_handlerSession.doAppleCredentialResponse(event.detail.authorization.id_token) 2532 }); 2533 2534 2535 // Listen for authorization failures. 2536 document.addEventListener('AppleIDSignInOnFailure', (event) => { 2537 // Handle error. 2538 console.log('AppleIDSignInOnFailure', event); 2539 }); 2540 }, "https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"); 2541 }; 2542 2543 if (sessionModalEl) 2544 sessionModalEl.addEventListener("shown.bs.modal", window.doInitAppleSign
2544In); 2545 }) 2546</script>
2546 2547 2548 2549 2550<input autocomplete="off" style="visibility: hidden;display: none;" type="file" id="UI_addPicture" multiple accept="image/x-png,image/jpeg" /> 2551<div id="UI_uploadImageModal" class="modal" tabindex="-1" role="dialog" style="z-index: 100000;"> 2552 <div class="modal-dialog" style=" width: auto;"> 2553 <div class="modal-content"> 2554 <div class="modal-header"> 2555 <div class="modal-title h4"> تØÙ ÙÙ Ø§ÙØµÙرة </div> 2556 <button type="button" class="btn border-0 bg-transparent p-0" data-bs-dismiss="modal" aria-label="غÙÙ" style="position: inherit; " data-bind="style:{'float': doGetCulture() == 'en'? 'right':'left'}"> 2557 <i class="ci-close"></i> 2558 </button> 2559 </div> 2560 <div class="modal-body pt-1 px-0 pb-0" id="UI_bodyImageModal"> 2561 <div id="image_demo"></div> 2562 </div> 2563 <div class="modal-footer py-1"> 2564 <div class="w-100" style="text-align: center;"> 2565 <button class="btn btn-primary crop_image py-1" id="crop_image"> 2566 <i class="ci-reduce"></i> 2567 Ø§Ø¶Ù ØµÙØ±Ø© 2568 </button> 2569 <button class="btn btn-secondary RotateRight py-1"> 2570 <i class="ci-compare"></i> 2571 Ø¯ÙØ±Ø§Ù 2572 </button> 2573 </div> 2574 </div> 2575 </div> 2576 </div> 2577</div> 2578 2579<style> 2580 /* Cropper look & feel â id-scoped so these win over micro-cropper.js's injected global rules */ 2581 #UI_uploadImageModal .modal-dialog { max-width: 480px; } 2582 #UI_uploadImageModal .modal-content { 2583 border: 0; 2584 border-radius: 18px; 2585 overflow: hidden; 2586 box-shadow: 0 24px 60px -14px rgba(17, 20, 28, .38); 2587 } 2588 #UI_uploadImageModal .modal-body { 2589 background: linear-gradient(180deg, #f6f7f9 0%, #eef0f3 100%); 2590 } 2591 #UI_uploadImageModal .croppie-container { padding: 16px 0 6px; } 2592 2593 /* darkened surround + rounded stage */ 2594 #UI_uploadImageModal .cr-boundary { 2595 border-radius: 14px; 2596 box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06); 2597 } 2598 /* crop window: soft white frame + subtle ring, keep Croppie's giant darken shadow */ 2599 #UI_uploadImageModal .cr-viewport { 2600 border: 3px solid #fff; 2601 border-radius: 16px; 2602 box-shadow: 0 0 0 1px rgba(0, 0, 0, .18), 0 0 2000px 2000px rgba(17, 20, 28, .55); 2603 } 2604 2605 /* zoom slider */ 2606 #UI_uploadImageModal .cr-slider-wrap { width: 82%; margin: 8px auto 18px; } 2607 #UI_uploadImageModal .cr-slider { padding: 10px 0; } 2608 #UI_uploadImageModal .cr-slider::-webkit-slider-runnable-track { 2609 height: 6px; border-radius: 6px; background: rgba(17, 20, 28, .14); 2610 } 2611 #UI_uploadImageModal .cr-slider::-webkit-slider-thumb { 2612 height: 20px; width: 20px; margin-top: -7px; border-radius: 50%; 2613 background: var(--theme-color, #fd5631); border: 2px solid #fff; 2614 box-shadow: 0 2px 6px rgba(0, 0, 0, .3); transition: transform .15s ease; 2615 } 2616 #UI_uploadImageModal .cr-slider:active::-webkit-slider-thumb { transform: scale(1.15); } 2617 #UI_uploadImageModal .cr-slider::-moz-range-track { 2618 height: 6px; border-radius: 6px; background: rgba(17, 20, 28, .14); 2619 } 2620 #UI_uploadImageModal .cr-slider::-moz-range-thumb { 2621 height: 20px; width: 20px; border-radius: 50%; 2622 background: var(--theme-color, #fd5631); border: 2px solid #fff; 2623 box-shadow: 0 2px 6px rgba(0, 0, 0, .3); 2624 } 2625 2626 /* footer actions */ 2627 #UI_uploadImageModal .modal-footer { 2628 background: #fff; border-top: 1px solid rgba(0, 0, 0, .06); padding: 14px; 2629 } 2630 #UI_uploadImageModal .modal-footer .w-100 { 2631 display: flex; justify-content: center; gap: 10px; 2632 } 2633 #UI_uploadImageModal .modal-footer .btn { 2634 border-radius: 12px; padding: .55rem 1.15rem; font-weight: 600; 2635 display: inline-flex; align-items: center; gap: .4rem; 2636 } 2637 #UI_uploadImageModal .modal-footer .btn i { font-size: 1.05rem; } 2638</style> 2639 2640
2641<script type="application/javascript"> 2642 2643 var image_crop = null; 2644 var image_handler = null; 2645 var image_id = null; 2646 var image_name = null; 2647 var image_param = null; 2648 var image_input = null; 2649 var image_object = null; 2650 var image_folder = null; 2651 var image_index = 0; 2652 var _cropperLoaded = false; 2653 2654 // Lazy-load micro-cropper.js on first use 2655 function doLoadCropper() { 2656 return new Promise(function (resolve) { 2657 if (_cropperLoaded || typeof Croppie !== 'undefined') { _cropperLoaded = true; resolve(); return; } 2658 var s = document.createElement('script'); 2659 // Versioned like every other asset. This one builds its own
2659<script> instead of 2660 // going through doLoadScript, so it does not inherit the cache-busting there and 2661 // a deploy would keep serving the previously cached copy. 2662 s.src = 'https://cdn.brandfull.com/_Js/micro-cropper.js?v=639260136226636726'; 2663 s.onload = function () { _cropperLoaded = true; resolve(); }; 2664 document.head.appendChild(s); 2665 }); 2666 } 2667 2668 document.getElementById("UI_addPicture").addEventListener('change', function () { 2669 doShowModal('UI_uploadImageModal'); 2670 2671 image_input = document.getElementById("UI_addPicture"); 2672 image_index = image_input.files.length - 1; 2673 doLoadCropper().then(function () { 2674 doInitImageTool(image_input, image_object._dimension(), null, image_object._order(), null); 2675 }); 2676 }); 2677 2678 document.getElementById("UI_uploadImageModal").addEventListener('hidden.bs.modal', function() { 2679 document.getElementById("UI_addPicture").value = ''; 2680 }); 2681 2682 var m_currentPicture = null; 2683 window.doOpenCropper = function (handler, folder, item) { 2684 image_handler = handler; 2685 image_folder = folder; 2686 image_object = item; 2687 doLoadCropper().then(function () { 2688 if (item._binary()) { 2689 doShowModal('UI_uploadImageModal'); 2690 doInitImageTool(document.getElementById("UI_addPicture"), item._dimension(), item._binary(), item._order(), item._name()); 2691 } 2692 else if (item._name()) { 2693 doShowModal('UI_uploadImageModal'); 2694 doInitImageTool(document.getElementById("UI_addPicture"), item._dimension(), image_folder + '/' + item._name(), item._order(), item._name()); 2695 } 2696 else 2697 document.getElementById("UI_addPicture").click(); 2698 }); 2699 } 2700 2701 function doInitImageTool(input, dimension, imagepath = null, entityId = null, entityName = null) { 2702 var image_demo = document.querySelector('#image_demo'); 2703 image_id = entityId; 2704 image_name = entityName; 2705 image_input = input; 2706 image_param = doGetParamPicture(dimension); 2707 if (image_crop != null) 2708 image_crop.destroy(); 2709 2710 var xW = image_param.size.width / Math.max(image_param.size.height, image_param.size.width); 2711 image_param.viewport.width = image_param.viewport.width * xW; 2712 var xH = image_param.size.height / Math.max(image_param.size.height, image_param.size.width); 2713 image_param.viewport.height = image_param.viewport.height * xH; 2714 image_crop = new Croppie(image_demo, { 2715 showZoomer: true, 2716 enableResize: false, 2717 enableOrientation: true, 2718 enforceBoundary: true, 2719 mouseWheelZoom: true, 2720 enableExif: true, 2721 viewport: image_param.viewport, 2722 boundary: image_param.boundary 2723 }); 2724 2725 var reader = new FileReader(); 2726 reader.onload = function (event) { 2727 image_crop.bind({ 2728 url: event.target.result, 2729 }).then(function () { 2730 image_crop.setZoom(0); 2731 }); 2732 }; 2733 2734 if (imagepath != null) { 2735 var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i; 2736 var isBase64Valid = base64Rejex.test(imagepath); 2737 if (isBase64Valid) { 2738 var url = "data:image/png;base64," + imagepath; 2739 var byteString = atob(url.split(',')[1]); 2740 var ab = new ArrayBuffer(byteString.length); 2741 var ia = new Uint8Array(ab); 2742 for (var i = 0; i < byteString.length; i++) { 2743 ia[i] = byteString.charCodeAt(i); 2744 } 2745 var blob = new Blob([ab], { type: image_param.format ? 'image/' + image_param.format : 'image/jpeg' }); 2746 reader.readAsDataURL(blob); 2747 } 2748 else { 2749 var request = new XMLHttpRequest(); 2750 request.open("POST", '/ConvertBinary?imageUrl=' + imagepath, true); 2751 request.onreadystatechange = function () { 2752 if (request.readyState == 4) 2753 { 2754 if (request.status == 200) { 2755 try { 2756 response = JSON.parse(request.responseText); 2757 var url = "data:image/png;base64," + response.imageData; 2758 var byteString = atob(url.split(',')[1]); 2759 var ab = new ArrayBuffer(byteString.length); 2760 var ia = new Uint8Array(ab); 2761 for (var i = 0; i < byteString.length; i++) { 2762 ia[i] = byteString.charCodeAt(i); 2763 } 2764 var blob = new Blob([ab], { type: image_param.format ? 'image/' + image_param.format : 'image/jpeg' });
2765 reader.readAsDataURL(blob); 2766 } 2767 catch (error) { response = request.responseText; } 2768 } 2769 } 2770 }; 2771 request.send(); 2772 } 2773 } 2774 else if (input.files.length != 0) { 2775 reader.readAsDataURL(input.files[image_index]); 2776 } 2777 } 2778 2779 2780 function doGetParamPicture(dimension) { 2781 var pSize = document.getElementById('UI_bodyImageModal').clientWidth; 2782 2783 var dimensions = dimension.split("x"); 2784 if (dimensions.length != 2) 2785 dimensions = dimension.split("X"); 2786 if (dimensions.length != 2) 2787 dimensions = dimension.split("*"); 2788 return { 2789 size: { width: dimensions[0], height: dimensions[1] }, 2790 viewport: { width: pSize * 0.75, height: pSize * 0.75, type: 'square' }, 2791 boundary: { width: pSize - 30, height: pSize - 30 } 2792 }; 2793 } 2794 function doClickCrop() { 2795 if (image_crop == null) 2796 return; 2797 2798 image_crop.result({ 2799 type: 'canvas', 2800 size: image_param.size, 2801 format: image_param.format ? image_param.format : "jpeg", 2802 quality: image_param.quality ? image_param.quality.value : 0.5 2803 }).then(function (response) { 2804 var size = response.length / (1024 * 1024); 2805 if (response && size < 4) 2806 { 2807 image_object = image_handler.doAddImage(image_input ? image_input.id : null, image_id, image_name, response.split(";base64,")[1], response.split(";base64,")[0].split("/")[1]); 2808 if (image_index != 0 && image_object != null && image_object != undefined) { 2809 image_index = image_index - 1; 2810 setTimeout(doInitImageTool.bind(null, image_input, image_object._dimension(), null, image_object._order(), null), 250); 2811 } 2812 else 2813 doHideModal('UI_uploadImageModal'); 2814 } 2815 }); 2816 } 2817 function doClickRotateRight() { 2818 if (image_crop != null) 2819 image_crop.rotate(90); 2820 } 2821 2822 document.querySelector("#crop_image").removeEventListener('click', doClickCrop); 2823 document.querySelector('#crop_image').addEventListener('click', doClickCrop); 2824 2825 document.querySelector(".RotateRight").removeEventListener('click', doClickRotateRight); 2826 document.querySelector('.RotateRight').addEventListener('click', doClickRotateRight); 2827 2828</script>
2828 2829 2830 2831 2832 2833 2834 2835 2836 2837
2838<script type="application/javascript"> 2839 // Body lives in Tools/Cartzilla/Footer.ts -- the three app footers each carried their own 2840 // near-identical copy of it. 2841 // 2842 // Must go through doLoadScript: Footer.ts is compiled into script.min.js, which is fetched 2843 // asynchronously, so doInitLayoutFooter does not exist yet when this inline script parses. 2844 // Calling it bare threw "doInitLayoutFooter is not defined" on every page. doLoadScript is 2845 // defined by _LayoutScript, which _Layout renders well before this partial, and it is 2846 // idempotent -- the bundle is requested once and later callbacks fire immediately. 2847 doLoadScript(function () { doInitLayoutFooter(); }); 2848</script>
2848 2849 2850<!-- Footer--> 2851 2852 2853<footer id="UI_LayoutFooter" class="footer bg-secondary" style="visibility: hidden;"> 2854 2855 2856 2857 <div id="UI_social" class="bf-surfaceBand px-lg-3"> 2858 <div class="container d-flex flex-md-row flex-sm-column py-sm-3 py-md-2 py-lg-3"> 2859 <div class="col-md-6 col-12 text-center mx-auto"> 2860 <h3 class="pb-1 text-accent mb-2">Ø§ÙØ¶Ù Ø¥ÙÙ ÙØ´Ø±ØªÙا Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© Ø§ÙØ¢Ù</h3> 2861 <p class="fs-sm d-sm-none text-white">تÙÙ٠آخر Ø§ÙØªØØ¯Ùثات ØÙÙ Ø§ÙØ¹Ø±Ùض Ø§ÙØªØ±ÙÙØ¬ÙØ© ÙÙ ÙØªØ¬Ø§ØªÙا</p> 2862 2863 </div> 2864 <div class="d-flex flex-wrap align-items-center col-md-6 col-12"> 2865 <div class="input-group flex-nowrap"> 2866 <i class="ci-mail position-absolute top-50 translate-middle-y text-muted fs-base ms-3-Auto zindex-10"></i> 2867 <input autocomplete="email" class="form-floating form-control rounded-start-Auto" type="email" data-bind="value : m_emailNewsletter" placeholder="Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ"> 2868 <button class=" btn btn-primary" type="button" data-bind="click : doSaveNewsletter"> 2869 ارس٠2870 </button> 2871 </div> 2872 <!-- ko if: !doCheckEmptyData(m_errorNewsletter()) --> 2873 <small class="text-danger" data-bind="text: m_errorNewsletter"></small> 2874 <!-- /ko --> 2875 <div class="subscription-status"></div> 2876 </div> 2877 </div> 2878 2879 </div> 2880 2881 <div class="p-lg-3 p-md-2 mb-2"> 2882 <div class="mx-auto px-1 row" style="max-width: 80rem;"> 2883 2884 <div id="UI_companyContact" class="col-md-4 col-12 order-sm-first"> 2885 2886 <div class="form-text text-black"> 2887 <div class="widget widget-light pb-2 mb-md-4"> 2888 <!-- ko if: !doCheckEmptyData(m_currentCompany._whatsappLink()) --> 2889 <a name="supportwhatsapp" class="btn-social bs-light bs-whatsapp me-1-Auto mb-1" href="#" aria-label="whatsapp" data-bind="attr:{href:m_currentCompany._whatsappLink}" target="_blank" enable-href="true" rel="noreferrer"> 2890 <i class="ci-whatsapp font-size-20"></i> 2891 </a> 2892 <!-- /ko --> 2893 <!-- ko if: !doCheckEmptyData(m_currentCompany._facebookLink()) --> 2894 <a name="supportfacebook" class="btn-social bs-light bs-facebook me-1-Auto mb-1" href="#" aria-label="facebook" data-bind="attr:{href:m_currentCompany._facebookLink}" target="_blank" enable-href="true" rel="noreferrer"> 2895 <i class="ci-facebook font-size-20"></i> 2896 </a> 2897 <!-- /ko --> 2898 <!-- ko if: !doCheckEmptyData(m_currentCompany._twitterLink()) --> 2899 <a name="supporttwitter" class="btn-social bs-light bs-twitter me-1-Auto mb-1" href="#" aria-label="twitter" data-bind="attr:{href:m_currentCompany._twitterLink}" target="_blank" enable-href="true" rel="noreferrer"> 2900 <i class="ci-twitter font-size-20"></i> 2901 </a> 2902 <!-- /ko --> 2903 <!-- ko if: !doCheckEmptyData(m_currentCompany._instagramLink()) --> 2904 <a name="supportinstagram" class="btn-social bs-light bs-instagram me-1-Auto mb-1" href="#" aria-label="instagram" data-bind="attr:{href:m_currentCompany._instagramLink}" target="_blank" enable-href="true" rel="noreferrer"> 2905 <i class="ci-instagram font-size-20"></i> 2906 </a> 2907 <!-- /ko --> 2908 <!-- ko if: !doCheckEmptyData(m_currentCompany._snapchatLink()) --> 2909 <a name="supportsnapchat" class="btn-social bs-light bs-facebook me-1-Auto mb-1" href="#" aria-label="snapchat" data-bind="attr:{href:m_currentCompany._snapchatLink}" target="_blank" enable-href="true" rel="noreferrer"> 2910 <i class="ci-snapchat font-size-20"></i> 2911 </a> 2912 <!-- /ko --> 2913 <!-- ko if: !doCheckEmptyData(m_currentCompany._tiktokLink()) --> 2914 <a name="supporttiktok" class="btn-social bs-light bs-facebook me-1-Auto mb
2914-1" href="#" aria-label="tiktok" data-bind="attr:{href:m_currentCompany._tiktokLink}" target="_blank" enable-href="true" rel="noreferrer"> 2915 <i class="ci-tiktok font-size-20"></i> 2916 </a> 2917 <!-- /ko --> 2918 </div> 2919 </div> 2920 2921 2922 <div class="d-grid col-12"> 2923 <div class="form-text text-white me-2-Auto"> 2924 <i class="ci-location"></i> 2925 <span data-bind="html: doGetAddress(m_currentCompany._addressModel, '</br>')"> 2926 </span> 2927 </div> 2928 <div class="d-flex flex-wrap text-white"> 2929 <div class="me-2-Auto widget-light"> 2930 <i class="ci-mail"></i> 2931 <a href="#" class="widget-list-link d-inline " data-bind="attr:{href: 'mailto:'+ m_currentCompany._addressModel._email()}" target="_blank" enable-href="true" rel="noreferrer"> 2932 <b data-bind="text:m_currentCompany._addressModel._email"></b> 2933 </a> 2934 </div> 2935 <div class="me-2-Auto widget-light widget-list-item"> 2936 <i class="ci-phone"></i> 2937 <a href="#" class="widget-list-link d-inline" data-bind="attr:{href: 'tel:'+ m_currentCompany._addressModel._phone()}" target="_blank" enable-href="true" rel="noreferrer"> 2938 <b data-bind="text:m_currentCompany._addressModel._phone"></b> 2939 </a> 2940 </div> 2941 </div> 2942 2943 </div> 2944 2945 </div> 2946 2947 2948 <div id="UI_companyInfo" class="col-md-4 col-12 px-md-0 mb-2 m-sm-3"> 2949 <div class=" row mt-n1 form-text text-black mb-1"> 2950 <div class="col-3 "> 2951 <a class="d-inline-block align-middle" href="#"> 2952 <!-- ko if: !doCheckEmptyData(m_currentCompany._pictureModel._name()) --> 2953 <img loading="lazy" width="72" height="40" class="d-block" data-bind="attr:{src: doGetWebpLink('https://cdn.brandfull.com/Content/company/'+ m_currentCompany._pictureModel._name()), title: m_currentCompany._name, alt: m_currentCompany._name}" alt="company"> 2954 <!-- /ko --> 2955 </a> 2956 </div> 2957 <div class="col-9"> 2958 <div class="form-text text-accent"> 2959 <strong class="font-size-16" data-bind="text: m_currentCompany._name()"></strong> 2960 </div> 2961 <div class="form-text text-white pb-2 mt-3"> 2962 <span class="" data-bind="text: m_currentCompany._description()"></span> 2963 2964 <div class="d-flex mt-sm-2" data-bind="foreach: { data: m_handlerLayout.m_listCategoryMenuDepartmentFooter, as: 'subCategory' }"> 2965 <a class="col-2" href="#" enable-href="false" data-bind="attr:{ href: doGetLinkLoadMenu (subCategory, 'About')}"> 2966 <!-- ko if: !doCheckEmptyData(subCategory._pictureName()) --> 2967 <img loading="lazy" class="p-1" data-bind="attr:{src: doGetWebpLink('https://cdn.brandfull.com/Content/category/'+subCategory._pictureName()), title:subCategory._name, alt:subCategory._name}" width="100%" height="100%" alt="category" /> 2968 <!-- /ko --> 2969 </a> 2970 </div> 2971 </div> 2972 </div> 2973 2974 </div> 2975 </div> 2976 2977 <div id="UI_companyLinks" class="col-md-4 col-12 mb-sm-5" style="display:flex; flex-wrap: wrap"> 2978 <!-- ko foreach: m_listCategoryMenuFooter --> 2979 <div class=" col-12 active footer-links " data-bind=" class: $root.m_listCategoryMenuFooter().length == 2? 'col-sm-6' : 'col-sm-4' ,attr:{'id': 'footing_'+ $index() }"> 2980 <div class="widget textAlignAuto"> 2981 <div class="widget widget-links widget-light mb-4"> 2982 <div class="h6 widget-title text-accent pb-1" data-bind="text: $data._name()"></div> 2983 <!-- ko if: $data._list().length!=0 --> 2984 <ul class="widget-list" data-bind="foreach: { data: $data._list(), as: 'subCategory' }"> 2985 <li class="widget-list-item"> 2986 <a class="widget-list-link" href="#" enable-href="false" data-bind="attr:{ href: doGetLinkLoadMenu (subCategory, 'About')}"> 2987 <!-- ko if: !doCheckEmptyData(subCategory._pictureName()) --> 2988 <i><img alt="" loading="lazy" data-bind="attr:{src: doGetWebpLink('https://cdn.brandfull.com/Content/category/'+subCategory._pictureName()), title:subCategory._name}" width="18" height="18" /></i> 2989 <!-- /ko -->
2990 <span data-bind="text: subCategory._name"></span> 2991 </a> 2992 </li> 2993 </ul> 2994 <!-- /ko --> 2995 </div> 2996 </div> 2997 </div> 2998 <!-- /ko --> 2999 </div> 3000 3001 </div> 3002 </div> 3003</footer> 3004 3005<!-- Back To Top Button--> 3006<a id="UI_topArraw" class="btn-scroll-top" onclick="doScrollToTop()"> 3007 <span class="btn-scroll-top-tooltip text-muted fs-sm me-2">أعÙÙ</span> 3008 <i class="btn-scroll-top-icon ci-arrow-up"></i> 3009</a> 3010 3011 3012<div id="UI_menuUserMobile" class="modal fade slide-up" tabindex="-1" role="dialog" aria-labelledby="UI_menuUserMobileLabel" aria-modal="true"> 3013 <div class="modal-dialog" role="document"> 3014 <div class="modal-content"> 3015 <div class="modal-header border-bottom"> 3016 <h5 class="modal-title fw-bold" id="UI_menuUserMobileLabel">ÙØ§Ø¦Ù Ø© اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ</h5> 3017 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 3018 </div> 3019 <div class="modal-body p-4"> 3020 <div class="widget widget-cart px-3 pt-2 pb-3 textAlignAuto"> 3021 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Profile" data-bs-dismiss="modal" aria-label="Close"> 3022 <i class="ci-user opacity-60 me-2-Auto"></i>اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ 3023 </a> 3024 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Invoices" data-bs-dismiss="modal" aria-label="Close"> 3025 <i class="ci-basket opacity-60 me-2-Auto"></i>اÙÙÙØ§ØªÙر 3026 </a> 3027 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Supports" data-bs-dismiss="modal" aria-label="Close"> 3028 <i class="ci-help opacity-60 me-2-Auto"></i>ØªØ°Ø§ÙØ± 3029 </a> 3030 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Messages" data-bs-dismiss="modal" aria-label="Close"> 3031 <i class="ci-message opacity-60 me-2-Auto"></i>رسائ٠3032 </a> 3033 3034 <div class="dropdown-divider"></div> 3035 <a class="dropdown-item d-flex align-items-center py-1" href="#" enable-href="false" data-bind="click: $root.doLogOut.bind($root, '/Account/LogOff?Value=https%3A%2F%2Fbrandfull.com%2FSupport%2FCreate')" data-bs-dismiss="modal" aria-label="Close"> 3036 <i class="ci-sign-out opacity-60 me-2-Auto"></i>تسجÙÙ Ø§ÙØ®Ø±Ùج 3037 </a> 3038 </div> 3039 </div> 3040 </div> 3041 </div> 3042</div> 3043 3044 3045<div id="UI_userModalAdvertisement" class="modal fade slide-up" tabindex="-1" role="dialog" aria-labelledby="UI_userModalAdvertisementLabel" aria-modal="true"> 3046 <div class="modal-dialog" role="document"> 3047 <div class="modal-content overflow-hidden"> 3048 <div class="modal-header border-bottom"> 3049 <h5 class="modal-title fw-bold" id="UI_userModalAdvertisementLabel">إشعار</h5> 3050 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 3051 </div> 3052 <div class="modal-body"> 3053 <div class="widget widget-cart pt-2 pb-0"> 3054 <div class="d-flex align-items-center justify-content-between"> 3055 <div class="col-md-10"> 3056 3057 <!-- ko if: m_handlerLayout.m_isViewMobile() --> 3058 <!-- ko if: m_enableNotifGrant() --> 3059 <button id="UI_notifGrant" class="btn d-flex align-content-between align-items-center font-size-10 p-1 " onclick="doGetPermissionNotification()"> 3060 <i class="ci-settings me-2-Auto font-size-14 "></i>
3061 <span class="form-check-label elide text-black fw-bolder heartbeat" for="UI_agreeWebPush"> 3062 ابÙÙ٠عÙÙ Ø§Ø·ÙØ§Ø¹ 3063 </span> 3064 </button> 3065 <!-- /ko --> 3066 <!-- ko if: m_enableNotifDenied() --> 3067 <div id="UI_notifDenied" class="d-flex align-content-between align-items-center font-size-10 p-1 "> 3068 <i class="ci-announcement me-2-Auto font-size-14 fw-bolder"></i> 3069 <span class="form-check-label elide text-danger fw-bolder heartbeat"> 3070 Ø§ÙØ¥Ø´Ø¹Ø§Ø±Ø§Øª Ù ØØ¬Ùبة. شغÙÙØ§ Ù٠إعدادات اÙÙ ØªØµÙØ ÙØªØØµÙ عÙÙ ØªÙØ¨ÙÙØ§Øª. 3071 </span> 3072 </div> 3073 <!-- /ko --> 3074 <!-- /ko --> 3075 </div> 3076 </div> 3077 3078 <div id="UI_notificationList" data-simplebar data-simplebar-auto-hide="false" style="overflow-x: hidden;max-height: 21rem;" data-bind="visible: m_listAdvertisement().length!=0, foreach: { data: m_showAdvertisement() ? m_listAdvertisement() : [] }"> 3079 <div class="border-bottom py-1 me-3-Auto d-flex justify-content-between border-danger" style=" border-bottom-style: dotted !important;" data-bs-dismiss="modal"> 3080 <label class="form-text elide w-75 pointer" data-bind="click: $root.doSetTaged.bind($root, $data, true), text:$data._subject()"></label> 3081 <b class="form-check-label textAlignReverse font-size-10 d-inline-block mb-n2 fw-light" data-bind="click: $root.doSetTaged.bind($root, $data, true), text: doCalcDateDifference(doCastFromUTC($data._dateCreate()))"></b> 3082 </div> 3083</div> 3084 3085 </div> 3086 3087 </div> 3088 </div> 3089 </div> 3090</div> 3091<div id="UI_footerMenu" class="handheld-toolbar position-fixed show" style="height: 3.5rem;"> 3092 <div class="d-table table-layout-fixed w-100 pt-1" style="height: 100%"> 3093 3094 <a name="footer-home" class="d-table-cell handheld-toolbar-item" href="/" rel="nofollow" enable-href="false" aria-label="go to home"> 3095 <span class="handheld-toolbar-icon"><i class="ci-home"></i></span> 3096 </a> 3097 <a name="footer-user" class="d-table-cell handheld-toolbar-item" aria-label="ÙØ§Ø¦Ù Ø© اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ" href="javascript:void(0)" enable-href="false" rel="nofollow" listener="false" onclick="doOpenProfile()"> 3098 <span class="handheld-toolbar-icon"><i class="ci-user"></i></span> 3099 </a> 3100 3101 3102 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 3103 <a name="footer-favorites" class="d-table-cell handheld-toolbar-item" aria-label="اÙÙ ÙØ¶ÙÙ" href="/Account/Favorites" rel="nofollow" enable-href="false"> 3104 <span class="handheld-toolbar-icon"><i class="ci-heart"></i></span> 3105 </a> 3106 3107 <a name="footer-notes" class="d-table-cell handheld-toolbar-item" aria-label="إشعار" href="javascript:void(0)" rel="nofollow" enable-href="false" listener="false" onclick="doOpenAdvertisementModal()"> 3108 <span class="handheld-toolbar-icon"> 3109 <!-- ko if: m_countAdvertisement() != 0 --> 3110 <span class="bg-danger font-size-10 text-white counterAdv" data-bind="text: m_countAdvertisement() > 99 ? '99+' : m_countAdvertisement()"></span> 3111 <!-- /ko --> 3112 <i class="ci-bell"></i> 3113 </span> 3114 </a> 3115 <!-- /ko --> 3116 3117 </div> 3118</div> 3119 3120 3121 3122 <!-- END FOOTER --> 3123 <div id="UI_preLoader" class="nav-progress" role="progressbar" aria-live="polite" 3124 style="display: none;" 3125 data-bind="visible: m_handlerLayout.m_customLoader()"> 3126 <span class="nav-progress-bar"></span> 3127 <span class="seo-hidden">تØÙ ÙÙ</span> 3128 </div> 3129 <!-- Google Tag Manager -->
3130<script> 3131 //we need it for GTMManager 3132 doLoadScript(function() { 3133 doSetThirdParty(window.dataLayer); 3134 }); 3135</script>
3135 3136<!-- End Google Tag Manager --> 3137<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 3137-3138
3137 3138<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3138GTM-PTJJCWLL
vendor: 83 bytes, line 3138
3138" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
3139<!-- End Google Tag Manager (noscript) --> 3140 3141 3142 3143<noscript> 3144 <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=602667531455664&ev=PageView&noscript=1" /> 3145</noscript> 3146<!-- End Meta Pixel Code --> 3147 <svg id="8dfd9ecb-4c59-4082-9d62-10717474add2.svg" style="display: none;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1124.14 1256.39"> 3148 <path class="cls-1" d="M699.62,1113.02h0c-20.06,44.48-33.32,92.75-38.4,143.37l424.51-90.24c20.06-44.47,33.31-92.75,38.4-143.37l-424.51,90.24Z"></path> 3149 <path class="cls-1" d="M1085.73,895.8c20.06-44.47,33.32-92.75,38.4-143.37l-330.68,70.33v-135.2l292.27-62.11c20.06-44.47,33.32-92.75,38.4-143.37l-330.68,70.27V66.13c-50.67,28.45-95.67,66.32-132.25,110.99v403.35l-132.25,28.11V0c-50.67,28.44-95.67,66.32-132.25,110.99v525.69l-295.91,62.88c-20.06,44.47-33.33,92.75-38.42,143.37l334.33-71.05v170.26l-358.3,76.14c-20.06,44.47-33.32,92.75-38.4,143.37l375.04-79.7c30.53-6.35,56.77-24.4,73.83-49.24l68.78-101.97v-.02c7.14-10.55,11.3-23.27,11.3-36.97v-149.98l132.25-28.11v270.4l424.53-90.28Z"></path> 3150</svg> 3151 3152 3153
3154<script type="application/javascript"> 3155 // What is left here is what is genuinely PER-REQUEST. m_jsonTranslate, jsonListCategory, 3156 // jsonListCompany and jsonListCountry have all moved to /InitData.js (HostController), because 3157 // none of them varies by anything but language: inlining them meant re-sending ~280 KB, the 3158 // category tree alone 270 KB of a 784 KB document, on every navigation and cached by nothing. 3159 // _LayoutScript requests that file first, ahead of the bundle, and the ready queue will not run a 3160 // callback until it has landed. 3161 // 3162 // Property writes onto GlobalSettingTranslateEnum. This one stays: it is resolved from the 3163 // request's companyID header, so it is not the same answer for two visitors on one deployment. 3164 // The body has to stay unevaluated until doSetEnumManager calls it -- GlobalSettingTranslateEnum 3165 // comes from /InitData.js along with the other 110 enums, and does not exist at this point in 3166 // the parse. (It was a script.min.js symbol until the enums moved; same answer either way.) 3167 function doApplySettingByCompany() { 3168 GlobalSettingTranslateEnum.PathCategoryPicture = "https://cdn.brandfull.com/Content/category/"; 3169GlobalSettingTranslateEnum.PathObjectTypePicture = "https://cdn.brandfull.com/Content/objecttype/"; 3170GlobalSettingTranslateEnum.PathObjectPicture = "https://cdn.brandfull.com/Content/object/"; 3171GlobalSettingTranslateEnum.PathPaymentMethodPicture = "https://cdn.brandfull.com/Content/paymentMethod/"; 3172GlobalSettingTranslateEnum.PathTrackerPicture = "https://cdn.brandfull.com/Content/tracker/"; 3173GlobalSettingTranslateEnum.PathShipmentMethodPicture = "https://cdn.brandfull.com/Content/shipmentMethod/"; 3174GlobalSettingTranslateEnum.PathCountryPicture = "https://cdn.brandfull.com/Content/country/"; 3175GlobalSettingTranslateEnum.BaseUrlAPI = "https://brandfullsapi.azurewebsites.net"; 3176GlobalSettingTranslateEnum.BaseUrl = "https://brandfull.com"; 3177GlobalSettingTranslateEnum.Take = "8"; 3178GlobalSettingTranslateEnum.CdnUrl = "https://cdn.brandfull.com"; 3179GlobalSettingTranslateEnum.RedirectUrlPaymentWeb = "https://brandfull.com/Invoice/Edit"; 3180GlobalSettingTranslateEnum.PathCompanyPicture = "https://cdn.brandfull.com/Content/company/"; 3181GlobalSettingTranslateEnum.TicketLifeTime = ""; 3182GlobalSettingTranslateEnum.AppName = "Brandfull"; 3183GlobalSettingTranslateEnum.PathSlidePicture = "https://cdn.brandfull.com/Content/slide/"; 3184GlobalSettingTranslateEnum.TakeObjectShop = "20"; 3185GlobalSettingTranslateEnum.PathReplayPicture = "https://cdn.brandfull.com/Content/replay/"; 3186GlobalSettingTranslateEnum.MessageServiceStatus = "true"; 3187GlobalSettingTranslateEnum.SmartPricingServiceStatus = ""; 3188GlobalSettingTranslateEnum.PathChatPicture = "https://cdn.brandfull.com/Content/chat/"; 3189GlobalSettingTranslateEnum.PathDetailPicture = "https://cdn.brandfull.com/Content/detail/"; 3190GlobalSettingTranslateEnum.PathColorPicture = "https://cdn.brandfull.com/Content/color/"; 3191GlobalSettingTranslateEnum.LimitAddCartQuantity = ""; 3192GlobalSettingTranslateEnum.MaketPlaceServiceStatus = "true"; 3193GlobalSettingTranslateEnum.PathDivPicture = "https://cdn.brandfull.com/Content/divTemplate/"; 3194GlobalSettingTranslateEnum.PathProfilePicture = "https://cdn.brandfull.com/Content/profile/"; 3195GlobalSettingTranslateEnum.PathMessagePicture = "https://cdn.brandfull.com/Content/message/"; 3196GlobalSettingTranslateEnum.PathSurveyPicture = "https://cdn.brandfull.com/Content/survey/"; 3197GlobalSettingTranslateEnum.PathInvoiceDetailStatusPicture = "https://cdn.brandfull.com/Content/invoiceDetailStatus/"; 3198 3199 } 3200</script>
3200 3201 3202 3203
3204<script id="Template_Empty" type="text/html"></script>
3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217
3218<script id="Template_ItemComponent_ObjectDefault" type="text/html"><div class="card product-card shadow-none" data-bind="class: $data.mode"><!--ko if : $data._listCategoryTop().length != 0 --><div class="badge p-0 d-flex flex-column gap-1"><!-- ko foreach: $data._listCategoryTop --><a class="bg-danger rounded-2 px-1 font-size-10" href="#" enable-href="false" data-bind=" 3219 html: doGenerateLabel($data._label()), 3220 style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()}, 3221 attr:{href: doGetLinkCategory($data), 'data-divID': $parent.divID }"></a><!-- /ko --></div><!-- /ko --><!--ko if : $data._deliveryType() == DeliveryTypeEnum.Wanted --><div class="position-sticky overflow-hidden " ><a class="card-img-top d-block h-100 overflow-hidden" href="javascript: void(0)" aria-label="product" enable-href="false" data-bind="css:{'card-img-bottom': $data.mode != ''}"><img loading="lazy" class="rounded" style="max-height: 100%; height: 100%; object-fit: cover;" data-bind="attr:{ title: $data._name, src: doGetDefaultPictureByObject($data, $data.pictureSize), loading: $data.isAboveFold ? 'eager' : 'lazy', fetchpriority: $data.isLcp ? 'high' : null}" alt="Product"></a></div><div class="card-body p-0" data-bind="css:{'mb-4': ($data.mode =='OnePicture' && m_handlerLayout.m_isViewMobile() == true)}"><a class="elide mb-1" href="javascript: void(0)" aria-label="stock" name="stock" enable-href="false" data-bind="text: $data._name"></a><p data-bind="text: $data._description"></p><!--ko if : $data._listCategoryBottom().length != 0 --><div class="d-flex flex-column"><!-- ko foreach: $data._listCategoryBottom --><a class="font-size-10 elide w-100" href="#" aria-label="category" name="category" enable-href="false" data-bind=" 3222 html: doGenerateLabel($data._label()), 3223 style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()}, 3224 attr:{href: doGetLinkCategory($data) , 'data-divID': $parent.divID}"></a><!-- /ko --></div><!-- /ko --></div><!-- /ko --><!--ko if : $data._deliveryType() != DeliveryTypeEnum.Wanted --><button class="btn-wishlist btn-sm " type="button" title="Ø£ÙØ§ Ø£ØØ¨" data-bind="style: { color: $data._likeCount()!=0 ? 'red' : '' }, click: m_handlerLayout.doSaveLike.bind(m_handlerLayout, $data)"><i class="fs-6" data-bind="class: $data._hasLike() ? 'ci-heart-filled ':'ci-heart', css:{'hasLike':$data._hasLike()==true}, "></i></button><div class="position-sticky overflow-hidden" ><a class="card-img-top d-block h-100 overflow-hidden" href="#" aria-label="product" enable-href="false" data-bind="css:{'card-img-bottom': $data.mode != ''}, attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"><img loading="lazy" class="h-100" data-bind="attr:{ title: $data._name, src: doGetDefaultPictureByObject($data, $data.pictureSize), loading: $data.isAboveFold ? 'eager' : 'lazy', fetchpriority: $data.isLcp ? 'high' : null}" alt="Product"></a><div class="d-flex w-100 mb-n3 zindex-10" style=" position: absolute; bottom: 42px;"><!--ko if : $data._objectStockModel._enableBidding() && $data._objectStockModel._enableTimerBidding() --><div class="countdown w-100 mb-0 rounded-bottom px-1 justify-content-start align-items-baseline" style="height:32px;" data-bind="attr:{id: doGetTimerID($data._objectStockModel, 'UI_timerBidding')}, childrenComplete : doJsCountDown(doGetTimerID($data._objectStockModel, 'UI_timerBidding'), true, $data._objectStockModel)"><div class="countdown-label w-100 text-light m-0 font-size-10" style="height:10px" ></div><div class="countdown-days w-25 countdown-value text-light bold m-0 font-size-16" ></div><div class="countdown-hours w-25 countdown-value text-light bold m-0 font-size-16"></div><div class="countdown-minutes w-25 countdown-value text-light bold m-0 font-size-16"></div><div class="countdown-seconds w-25 countdown-value text-light bold m-0 font-size-16"></div><div class="hide countdown-time w-100 countdown-value text-light m-0 font-size-16"></div></div><!-- /ko --></div><div class="fs-sm w-100 px-1 d-flex align-items-center justify-content-between" style="height: 26p
3224x"><div class="float-start mt-1" data-bind="foreach: $data._listColorSimiler"><a href="#" aria-label="color" name="color" class="colorSimiler" enable-href="false" data-bind="title: doGetDefaultNameColor($data), attr:{href: doGetLinkObject($data), 'data-divID':$parent.divID, 'id':'UI_sc_' +$parent._code()+'_'+$data._code()}"><label class="form-option-label rounded-circle" data-bind="attr:{'for':'UI_sc_' +$parent._code()+'_'+$data._code()}"><span class="form-option-color rounded-circle" data-bind="title: $data._objectName(), style:{'background': '-webkit-linear-gradient(45deg, ' + $data._hexName() + ' 60%, ' + doGetDefaultHexColor($data) + ' 40%)'}"></span></label></a></div><!--ko if : doCheckUUID($data._sizeModel._id()) --><a href="#" aria-label="size" name="size" class="float-end" enable-href="true" data-bind="text: $data._sizeModel._name(), attr:{href: doGetURL('Shop/search/') + $data._sizeModel._name(), 'data-divID':$data.divID}"></a><!-- /ko --></div></div><div class="card-body p-0" data-bind="css:{'mb-4': ($data.mode =='OnePicture' && m_handlerLayout.m_isViewMobile() == true)}"><div class="product-title fs-sm"><div class="brandRow"><!--ko with : doGetCategoryByType($data, CategoryTypeEnum.Brand) --><a class="brandRow-name fw-semibold text-decoration-none" href="#" aria-label="brand" name="brand" enable-href="false" 3225 data-bind="text: $data._name, attr:{ href: doGetLinkCategory($data), 'data-divID': $parent.divID }"></a><!-- /ko --><!--ko if : $data._sellMode() != SellModeEnum.SellWithOtherOnly && $data._objectStockModel._priceSale() != 0 && $data._objectStockModel._objectStockStatus() != ObjectStockStatusEnum.OutStock && $data._objectStockModel._objectStockStatus() != ObjectStockStatusEnum.Solded --><a class="btn-cart-inline pointer" href="#" name="addcart" aria-label="buy" title="buy" data-bind="click: m_handlerSession.doAddCart.bind(m_handlerSession, $data, 1, null, null, $data.divID)"><i class="ci-card-bag flipAuto"></i></a><!-- /ko --></div><a class="elide mb-1" href="#" aria-label="product" name="product" enable-href="false" data-bind="attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"><h2 class="font-size-14" data-bind="text: $data._name"></h2></a><div class="d-flex justify-content-between text-accent rounded-1" style="min-height: 2.5rem;"><!--ko if : $data._objectStockModel._priceSale() !=0 --><div class="text-accent sale w-100" style="display: flex;flex-wrap: wrap; align-items: baseline; column-gap: .4rem;" data-bind="html: m_handlerLayout.doHtmlPriceByCurrency($data, false, 0, true)"></div><!-- /ko --><!--ko if : $data._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.Solded --><a href="#" aria-label="Solded" name="Solded" class="btn btn-sm px-2 py-1 pointer bg-black text-white font-size-10" style="height: fit-content;" title="Re-Buy" data-bind="attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"> 3226 ٠باع 3227 </a><!-- /ko --><!--ko if : $data._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.OutStock --><a href="#" aria-label="OutStock" name="OutStock" class="btn btn-sm px-2 py-1 pointer bg-danger text-white font-size-10" style="height: fit-content;" title="Re-Buy" data-bind="attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"> 3228 ÙØ§ ÙÙØ¬Ø¯ ٠خزÙÙ 3229 </a><!-- /ko --></div></div><!--ko if : $data._listCategoryBottom().length != 0 --><div class="d-flex flex-column"><!-- ko foreach: $data._listCategoryBottom --><a class="font-size-10 elide w-100" href="#" aria-label="category" name="category" enable-href="false" data-bind=" 3230 html: doGenerateLabel($data._label()), 3231 style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()}, 3232 attr:{href: doGetLinkCategory($data), 'data-divID':$parent.divID }"></a><!-- /ko --></div><!-- /ko --></div><!-- /ko --></div></script>
3232<script id="Template_ItemComponent_AdvanceAuto" type="text/html"><!--ko if : doGetSlideTitleVisible($data) || doGetSlideDescriptionVisible($data) || doGetSlideButtonVisible($data)--><div class="AdvanceAuto" data-bind="class: doGetSlideDescriptionVisible($data) ? '':'mb-3'"><div class="AdvanceAuto_lead"><div class="bf-sectionHead"><span class="h4" data-bind="visible: doGetSlideTitleVisible($data), text: $data._title"></span></div><p class="AdvanceAuto_note text-muted font-size-12" data-bind="visible: doGetSlideDescriptionVisible($data), html: $data._description, style:{color: $data._descriptionHex}"></p></div><!--ko if : doGetSlideButtonVisible($data)--><a class="bf-viewAll" href="#" aria-label="subdiv" name="subdiv" enable-href="true" data-bind="attr:{ href: doGetURL($data._link()), 'aria-label':$data._title}"><span data-bind="text: $data._button"></span><i data-bind="class: doGetCulture() =='en'? 'ci-arrow-right':'ci-arrow-left' "></i></a><!-- /ko --></div><!-- /ko --></script>
3232 3233<style> 3234 .product-card.shadow-none { 3235 box-shadow: unset !important; 3236 background-color: transparent; 3237 } 3238 3239 [lang="en"] .magicFlex a:last-of-type { 3240 margin-left: auto !important; 3241 } 3242 3243 [lang="ar"] .magicFlex a:last-of-type { 3244 margin-right: auto !important; 3245 } 3246 3247 .BigPicture , .BigPicture .position-sticky{ 3248 height: 100%; 3249 } 3250 3251.brandRow { 3252 display: flex; 3253 align-items: center; 3254 gap: .35rem; 3255 margin-bottom: .25rem; 3256 min-height: 1.75rem; 3257 } 3258 3259 .brandRow-name { 3260 font-size: 11px; 3261 color: #444; 3262 letter-spacing: .3px; 3263 flex: 0 1 auto; 3264 min-width: 0; 3265 overflow: hidden; 3266 text-overflow: ellipsis; 3267 white-space: nowrap; 3268 } 3269 3270 @media screen and (max-width:992px) { 3271 3272 .BigPicture , .OnePicture{ 3273 flex-direction: row !important; 3274 align-items: flex-end !important; 3275 padding-bottom: 0px !important; 3276 } 3277 3278 .BigPicture .position-sticky, .OnePicture .position-sticky { 3279 width: 45% !important; 3280 height: 100% !important; 3281 padding-right: 10px !important; 3282 padding-left: 10px !important; 3283 } 3284 3285 .BigPicture .position-sticky .bg-opacity-75, .OnePicture .position-sticky .bg-opacity-75 { 3286 width: calc(100% - 20px) !important; 3287 } 3288 3289 .BigPicture .card-body, .OnePicture .card-body { 3290 width: 50% !important; 3291 } 3292 } 3293</style> 3294<style> 3295 .AdvanceAuto { 3296 position: relative; 3297 margin-top: .5rem; 3298 } 3299 3300 .AdvanceAuto .AdvanceAuto_lead { 3301 width: 100%; 3302 } 3303 3304 .AdvanceAuto .AdvanceAuto_note { 3305 margin: -.75rem 0 0; 3306 text-align: center; 3307 } 3308 3309@media screen and (min-width: 768px) { 3310 .AdvanceAuto .bf-viewAll { 3311 position: absolute; 3312 top: 0; 3313 inset-inline-end: 0; 3314 } 3315 } 3316 3317 @media screen and (max-width: 767px) { 3318 .AdvanceAuto { 3319 display: flex; 3320 flex-direction: column; 3321 align-items: center; 3322 } 3323 } 3324</style> 3325 3326 3327 3328 3329</body> 3330</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.