PageSourceSearch

https://brandfull.com/Account/Favorites

html brandfull.com collected 2026-09-26 17:13:08 UTC 196,294 bytes, 3,224 lines download raw bytes

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    <h2 class="seo-hidden"></h2>
1012
1013    
1013<script type="application/ld&#x2B;json">
1014        {
1015            "@context": "https://schema.org",
1016            "@type": "OnlineStore",
1017            "name": "Brandfull",
1018            "alternateName": "Brandfull",
1019            "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.",
1020            "knowsLanguage": "AR,EN",
1021            "sameAs": [
1022                "https://www.facebook.com/brandfullCom/",
1023                "https://twitter.com/brandful_l",
1024                "https://www.instagram.com/brandfull_ksa/",
1025                "https://api.whatsapp.com/send?phone=966592905003",
1026                "https://www.snapchat.com/add/brandful_l"
1027            ],
1028            "url": "https://brandfull.com",
1029            "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"}
1030        }
1031    </script>
1031
1032
1033    
1033<script type="application/ld&#x2B;json">
1034        {
1035            "@context": "https://schema.org",
1036            "@type": "ContactPoint",
1037            "@contactType": "Customer Service",
1038            "availableLanguage": "AR,EN",
1039            "email": "[email protected]",
1040            "telephone": "966592905003"
1041        }
1042    </script>
1042
1043    
1043<script type="application/ld&#x2B;json">
1044        {
1045            "@context": "https://schema.org",
1046            "@type": "WebSite",
1047            "name": "WebSite Brandfull",
1048            "url": "https://brandfull.com",
1049            "potentialAction": [
1050              {
1051                "@type": "SearchAction",
1052                "target": "https:/brandfull.com/Shop/search?q={search_term_string}",
1053                "query-input": "required name=search_term_string"
1054              }
1055             ]
1056         }
1057    </script>
1057
1058    
1059    
1060    <!-- Home Popup Section -->
1061    <!-- End Screen Load Popup Section -->
1062    <!-- START HEADER -->
1063
1064
1065    
1066
1067<script type="application/javascript">
1068
1069    window.doClosePopUp = function () {
1070        document.querySelectorAll('.dropdown-menu.show').forEach(function (option) {
1071            option.classList.remove('show');
1072        });
1073        document.querySelectorAll('.dropdown-menu.hide').forEach(function (option) {
1074            option.classList.remove('hide');
1075        });
1076    }
1077
1078    window.doShowQuickPopup = function (id, isFocus) {
1079        if (isFocus == true)
1080            m_handlerLayout.doGetQuickFilter();
1081        else
1082            setTimeout(function () {
1083                m_handlerLayout.m_showQuickPopUp(false);
1084            }, 250)
1085    }
1086
1087    window.doJSClickSearch = function (){
1088        var searchSection = document.querySelector('#UI_searchSection');
1089        if(searchSection.classList.contains('show'))
1090            searchSection.classList.remove('show');
1091        else
1092            searchSection.classList.add('show');
1093
1094        var searchIcon = document.querySelector('#UI_searchIcon');
1095        if(searchIcon.classList.contains('ci-search')){
1096            searchIcon.classList.remove('ci-search');
1097            searchIcon.classList.add('ci-close');
1098        }
1099        else{
1100            searchIcon.classList.remove('ci-close');
1101            searchIcon.classList.add('ci-search');
1102        }
1103    }
1104    doLoadScript(function () {
1105        if (!ko.dataFor(document.getElementById('UI_headerSession'))) {
1106            ko.applyBindings(m_handlerSession, document.getElementById("UI_headerSession"));
1107        }
1108
1109        if (!ko.dataFor(document.getElementById('UI_LayoutHeader'))) {
1110            ko.applyBindings(m_handlerLayout, document.getElementById("UI_LayoutHeader"));
1111            ko.applyBindings(m_handlerLayout, document.getElementById("UI_preLoader"));
1112        }
1113
1114        var navBar = document.getElementById("UI_menuNavBar");
1115        if (navBar) navBar.style.visibility = "visible";
1116        var searchPopup = document.getElementById("UI_searchQuickPopup");
1117        if (searchPopup) searchPopup.style.visibility = "visible";
1118        var layoutHeader = document.getElementById("UI_LayoutHeader");
1119        if (layoutHeader) layoutHeader.style.visibility = "visible";
1120        // After applyBindings above, so every marked block already carries the inline display its
1121        // binding gave it and nothing flashes as the gate lifts.
1122        if (layoutHeader) layoutHeader.classList.remove("ko-pending");
1123
1124        doJsDropdownSelect();
1125
1126    });
1127
1128</script>
1128
1129
1130
1131<header id="UI_LayoutHeader" class="bg-light shadow-sm fixHeightHeader ko-pending">
1132
1133    <div id="UI_menuQuick" class="topbar topbar-dark bg-darker py-sm-1 py-md-0">
1134        <div class="container">
1135            <div class="topbar-text dropdown d-md-none">
1136                <a class="topbar-link dropdown-toggle" href="#" data-bs-toggle="dropdown">روابط مفيدة</a>
1137                <ul class="dropdown-menu">
1138                    <li>
1139                        <a class="dropdown-item textAlignAuto" enable-href="false" href="/Support"><i class="ci-support  text-muted  me-2-Auto"></i>اتصل بنا</a>
1140                    </li>
1141                    <li>
1142                        <a class="dropdown-item textAlignAuto" href="#" target="_blank" enable-href="true" data-bind="attr:{href:m_handlerSession.m_currentCompany._whatsappLink}" rel="noreferrer">
1143                            <i class="ci-whatsapp text-muted me-2-Auto"></i>واتس اب
1144                        </a>
1145                    </li>
1146                </ul>
1147            </div>
1148            <div class="topbar-text text-nowrap d-none d-md-inline-block">
1149                <a class="topbar-link" enable-href="false" href="/Support"><i class="ci-support  me-2-Auto"></i>اتصل بنا</a>
1150                <!-- ko if:  !doCheckEmptyData(m_handlerSession.m_currentCompany._whatsappLink()) -->
1151                <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">
1152                    <i class="ci-whatsapp font-size-14"></i>
1153                </a>
1154                <!-- /ko -->
1155            </div>
1156
1157            <slotHeader class="bf-announceSlot"></slotHeader>
1158
1159            <div class="text-nowrap">
1160                <div class="topbar-text dropdown disable-autohide">
1161                    <a class="topbar-link dropdown-toggle" href="#" data-bs-toggle="dropdown">
1162                        <span class="px-1" data-bind="text: doGetCulture()=='ar'? 'عربى':'English'"></span>
1163                        <span class="px-1">/</span><span class="px-1" data-bind="text: m_handlerSession.m_currentCurrency._code"></span>
1164                    </a>
1165
1166                    <ul class="dropdown-menu dropdown-menu-end">
1167                        <!-- ko if: m_handlerSession.m_currentCompany._currences().length > 1 -->
1168                        <li class="dropdown-item">
1169                            <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'">
1170                            </select>
1171                        </li>
1172                        <!-- /ko -->
1173                        <!-- ko if: m_handlerSession.m_listCompany().length > 1 -->
1174                        <li class="dropdown-item">
1175                            <div class="fs-sm fw-medium mb-1 w-100 textAlignAuto">بلد</div>
1176                            <select class="form-select" style=" padding: 5px;" data-bind="value: m_handlerSession.m_currentCompany._id, options: m_handlerSession.m_listCompany, optionsText: '_countryName', optionsValue: '_id'">
1177                            </select>
1178                        </li>
1179                        <!-- /ko -->
1180                        <li>
1181                            <button class="dropdown-item d-flex align-items-center font-size-10" onclick="m_handlerSession.doSetCulture('ar')">
1182                                <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>
1183                                <span>عربى</span>
1184                            </button>
1185                        </li>
1186                        <li>
1187                            <button class="dropdown-item d-flex align-items-center font-size-10" onclick="m_handlerSession.doSetCulture('en')">
1188                                <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>
1189                                <span>English</span>
1190                            </button>
1191                        </li>
1192                    </ul>
1193                </div>
1194            </div>
1195        </div>
1196    </div>
1197    <div class="navbar-sticky bg-light pt-1">
1198        <div class="navbar navbar-expand-lg navbar-light py-0">
1199            <div class="container bf-headerRow">
1200                <div id="UI_searchSection" class="input-group widthSearch mt-sm-2 collapse">
1201                    <div class="input-group d-lg-flex m-0 ">
1202                        <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="البحث عن العلامة التجارية" />
1203                        <div class="m_searchIcons position-absolute top-50 translate-middle-y text-muted">
1204                                <i class="ci-camera pointer" data-bind="click: window.doOpenCropper.bind($root, $root, GlobalSettingTranslateEnum.PathObjectPicture, m_currentPicture)"></i>
1205                            <i class="ci-search pointer" data-bind="click: $root.doSearchByWord.bind($root)"></i>
1206                        </div>
1207                    </div>
1208
1209                    
1210
1211<div id="UI_searchQuickPopup" data-koPending class="quickPopUp border rounded-1 p-3 mt-md-n1 bg-white" data-bind="visible:m_showQuickPopUp()">
1212
1213    <!-- ko if: m_listQuickFilterCategory().length != 0 -->
1214    <b class="font-size-10 fw-bolder mt-2 mb-1 text-accent">فئات مفضلة لديكم</b>
1215    <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterCategory">
1216        <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()) }">
1217            <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()">
1218            </div>
1219        </a>
1220    </div>
1221    <!-- /ko -->
1222    <!-- ko if: m_listQuickFilterColor().length != 0 -->
1223    <b class="font-size-10 fw-bolder mt-3 mb-1 text-accent ">اللون ذات شعبيه</b>
1224    <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterColor">
1225        <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()) }">
1226            <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()">
1227            </div>
1228        </a>
1229    </div>
1230    <!-- /ko -->
1231    <!-- ko if: m_listQuickFilterTag().length != 0 -->
1232    <b class="font-size-10 fw-bolder mt-3 mb-1 text-accent">الماركات الأكثر شعبية</b>
1233    <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterTag">
1234        <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()) }">
1235            <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()">
1236            </div>
1237        </a>
1238    </div>
1239    <!-- /ko -->
1240
1241</div>
1242
1243                </div>
1244                <div class="bf-headerRow-lead">
1245                    <a class="navbar-tool d-lg-none" href="/#UI_menuSection" aria-label="menu" name="menu" onclick="doClosePo
1245pUp()" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="UI_menuSection">
1246                        <span class="navbar-tool-icon-box"><i class="navbar-toggler-icon  mt-1"></i></span>
1247                    </a>
1248                </div>
1249                <div class="bf-headerRow-brand">
1250                    <a class="navbar-brand textAlignAuto" href="https://brandfull.com" enable-href="true">
1251                            <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="العنوانالشعار" />
1252                    </a>
1253                </div>
1254                <!-- ko stopBinding: true -->
1255                <div id="UI_headerSession" class="navbar-toolbar d-flex flex-shrink-0 align-items-center bf-headerRow-trail">
1256                    
1257                    <!-- ko if: doCheckUUID(m_currentUser._id()) -->
1258                    <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">
1259                        <i class="navbar-tool-icon ci-heart" style="width: 45px;"></i>
1260                    </a>
1261                    <div class="navbar-tool dropdown pointer  d-lg-flex d-md-none d-sm-none" data-bind="visible: doCheckUUID(m_currentUser._id())" onmouseenter="doPrepareAdvertisement()">
1262                        <span class="navbar-tool-icon-box dropdown-toggle flipAuto" onclick="doOpenAdvertisement()">
1263                            <span class="navbar-tool-label flipAuto" data-bind="text: m_countAdvertisement() > 99 ? '99+' : m_countAdvertisement()"></span>
1264                            <i class="navbar-tool-icon ci-bell" style="width: 45px;"></i>
1265                        </span>
1266                        <div id="UI_menuWebAdvertisement" class="dropdown-menu dropdown-menu-end textAlignAuto">
1267                            <div class="widget widget-cart px-3 pt-2 pb-0">
1268                                <div class="d-flex align-items-center justify-content-between">
1269                                    <!-- ko if: !m_handlerLayout.m_isViewMobile() -->
1270                                    <div class="col-md-10">
1271                                        <!-- ko if: m_enableNotifGrant() -->
1272                                        <button id="UI_notifGrant" class="btn d-flex align-content-between align-items-center font-size-10 p-1 " onclick="doGetPermissionNotification()">
1273                                            <i class="ci-settings me-2-Auto font-size-14 "></i>
1274                                            <span class="form-check-label elide text-black fw-bolder heartbeat" for="UI_agreeWebPush">
1275                                                ابقني على اطلاع
1276                                            </span>
1277                                        </button>
1278                                        <!-- /ko -->
1279                                        <!-- ko if: m_enableNotifDenied() -->
1280                                        <div id="UI_notifDenied" class="d-flex align-content-between align-items-center font-size-10 p-1 ">
1281                                            <i class="ci-announcement me-2-Auto font-size-14  fw-bolder"></i>
1282                                            <span class="form-check-label elide text-danger fw-bolder heartbeat">
1283                                                الإشعارات محجوبة. شغلها في إعدادات المتصفح لتحصل على تنبيهات.
1284                                            </span>
1285                                        </div>
1286                                        <!-- /ko -->
1287
1288                                    </div>
1289                                    <!-- /ko -->
1290                                </div>
1291
1292                                <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() : [] }">
1293    <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="">
1294        <label class="form-text elide w-75 pointer" data-bind="click: $root.doSetTaged.bind($root, $data, true), text:$data._subject()"></label>
1295        <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>
1296    </div>
1297</div>
1298
1299                            </div>
1300                        </div>
1301                    </div>
1302                    
1303
1304                    <!-- /ko -->
1305                    <div id="UI_userSession" class="navbar-tool dropdown pointer  d-lg-flex d-md-none d-sm-none">
1306                        <span class="navbar-tool-icon-box " onclick="doOpenProfile()">
1307                            <i class="navbar-tool-icon ci-user "></i>
1308                        </span>
1309
1310                        <span class=" d-none d-lg-flex" style="padding-left:unset; max-width: 75px;" href="#">
1311                            <!-- ko if: doCheckUUID(m_currentUser._id()) -->
1312                            <small class="elide text-black" data-bind="text: m_currentUser._name()"></small>
1313                            <!-- /ko -->
1314                            <!-- ko if: !doCheckUUID(m_currentUser._id()) -->
1315                            <small class="elide text-black">حساب</small>
1316                            <!-- /ko -->
1317                        </span>
1318                        <!-- Session dropdown-->
1319                        <!-- ko if: doCheckUUID(m_currentUser._id()) -->
1320                        <div  class="dropdown-menu dropdown-menu-end">
1321                            <div class="widget widget-cart px-3 pt-2 pb-3 textAlignAuto">
1322                                <!-- ko if: doCheckUUID(m_currentUser._id()) -->
1323                                <div class="fs-sm fw-medium mb-1">حساب</div>
1324                                <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Profile">
1325                                    <i class="ci-user opacity-60 me-2-Auto"></i>الملف الشخصي
1326                                </a>
1327                                <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Invoices">
1328                                    <i class="ci-basket opacity-60 me-2-Auto"></i>الفواتير
1329                                </a>
1330                                <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Supports">
1331                                    <i class="ci-help opacity-60 me-2-Auto"></i>تذاكر
1332                                </a>
1333                                    <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Messages">
1334                                        <i class="ci-message opacity-60 me-2-Auto"></i>رسائل
1335                                    </a>
1336
1337                                <div class="dropdown-divider"></div>
1338                                <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%2FAccount%2FFavorites')">
1339                                    <i class="ci-sign-out opacity-60 me-2-Auto"></i>تسجيل الخروج
1340                                </a>
1341                                <!-- /ko -->
1342                            </div>
1343                        </div>
1344                        <!-- /ko -->
1345                    </div>
1346
1347                    <a href="#" aria-label="البحث" name="Search" class="navbar-tool-icon-box dropdown-toggle flipAuto" enable-href="false" onclick="doJSClickSearch()">
1348                        <i id="UI_searchIcon" class="navbar-tool-icon ci-search animate-target" style="width: 45px;"></i>
1349                    </a>
1350                    <div id="UI_shopNav" class="navbar-tool pointer" onclick="m_handlerSession.doOpenCartDrawer();">
1351                        <span class="navbar-tool-icon-box flipAuto">
1352                            <span class="navbar-tool-label flipAuto" data-bind="text: doGetCartCount()"></span>
1353                            <i class="navbar-tool-icon bold ci-card-bag"></i>
1354                        </span>
1355                        <span class="d-flex flex-column d-none d-md-flex ps-2-Auto">
1356                            <small class="font-size-10 text-black">سلة التسوق</small>
1357                            <!-- ko if: m_currentCart._listCartDetailModel().length!=0 -->
1358                            <span class="text-accent fs-base font-size-12" data-bind="html: $root.doCalcPriceDynamic(m_currentCart._total(), true)"></span>
1359                            <!-- /ko -->
1360                        </span>
1361                    </div>
1362
1363                </div>
1364                <!-- /ko -->
1365            </div>
1366            <!-- Search-->
1367        </div>
1368
1369
1370        <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;">
1371            <div class="container ">
1372                <div id="UI_menuSection" class="navbar-collapse collapse" data-bind="class: m_listCategoryMenuDepartmentHeader().length ==0 ? 'justify-content-around':''">
1373                    
1374<style>
1375
1376    /* The sprite URL is per-request (CDN base + m_version), so it cannot live in the bundled
1377       CSS. It is emitted once here and read by .categoryMerge in StyleCartzilla-Menu.css.
1378       It used to be a full inline `background: url(...)` on EVERY category node -- in this file
1379       and, worse, inside Template_ItemDeskMenu / Template_ItemMobileMenu, which recurse, so the
1380       whole CDN path was re-emitted into the live DOM once per category at every depth. */
1381    :root {
1382        --category-sprite: url('https://cdn.brandfull.com/Content/category/Merge.png?v=639260136446764345');
1383    }
1384
1385    .quickPopUp {
1386        visibility: hidden;
1387        z-index: +100;
1388        position: absolute;
1389        top: 47px;
1390    }
1391
1392    [lang="ar"] .quickPopUp {
1393        right: 1px;
1394    }
1395
1396    [lang="en"] .quickPopUp {
1397        left: 1px;
1398    }
1399
1400
1401    @media screen and (max-width:767px) {
1402        .quickPopUp {
1403            z-index: +1;
1404            position: unset;
1405            top: 81px;
1406            width: 100%;
1407            border: hidden !important;
1408        }
1409    }
1410</style>
1411
1412<script id="Template_ItemDeskMenu" type="text/html">
1413
1414
1415    <ul class="dropdown-menu " data-bind="foreach: $data._list, css:{'d-block fixRtl': $data.mode=='block' }">
1416        <li class="" data-bind="class: $data._list() != 0 ? 'dropdown':''">
1417            <a class="dropdown-item d-flex" href="#" enable-href="false" data-bind="
1418               class: $data._list() != 0 ? 'dropdown-toggle':'',
1419               attr:{href: doGetLinkCategory($data) }">
1420                <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1421                <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}">
1422                </span>
1423                <!-- /ko -->
1424                <span class="categoryColor menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span>
1425            </a>
1426            <!--ko if :  $data._list() != 0 -->
1427            <!-- ko run: $data.mode='' --><!-- /ko -->
1428            <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko -->
1429            <!-- /ko -->
1430        </li>
1431    </ul>
1432
1433</script>
vendor: 2 bytes, line 1433
1433
1434<script id="Template_ItemDeskMegaMenu" type="text/html">
1435
1436    <ul class="dropdown-menu " data-bind="foreach: $data._list">
1437        <li class="dropdown mega-dropdown">
1438            <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">
1439                <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1440                <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}">
1441                </span>
1442                <!-- /ko -->
1443                <span class="categoryColor menuSpan " data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span>
1444            </a>
1445        </li>
1446    </ul>
1447
1448
1449</script>
vendor: 2 bytes, line 1449
1449
1450<script id="Template_ItemMobileMenu" type="text/html">
1451
1452    <ul class="widget-list mt-1" data-bind="attr:{'id': 'UI_'+$data._id()}, css:{'collapse collapseShow mx-3': $data.mode=='block'}, foreach: $data._list">
1453        <li class="widget-list-item">
1454            <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) }">
1455                <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1456                <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}">
1457                </span>
1458                <!-- /ko -->
1459                <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>
1460            </a>
1461            <!--ko if :  $data._list() != 0 -->
1462            <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko -->
1463            <!-- /ko -->
1464        </li>
1465    </ul>
1466
1467</script>
1467
1468
1469
1470
1471<!-- ko ifnot: m_isMenuMobile() -->
1472<!-- ko if: $root.m_listCategoryMenuDepartmentHeader().length!=0 -->
1473<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">
1474    <li class="nav-item dropdown">
1475        <a class="nav-link dropdown-toggle ps-lg-0-Auto " href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside">
1476            <i class="ci-menu align-middle mt-n1 me-2-Auto"></i>
1477            الادارات
1478        </a>
1479        <ul class="dropdown-menu " data-bind="foreach: $root.m_listCategoryMenuDepartmentHeader">
1480            <li class="dropdown mega-dropdown">
1481                <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">
1482                    <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1483                    <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}">
1484                    </span>
1485                    <!-- /ko -->
1486                    <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>
1487                </a>
1488                <div class="dropdown-menu p-0 megaMenuRtl" data-bind="style: {'min-width': doCheckEmptyData($data._bannerName()) ? '0rem':'12rem'}">
1489                    <div class="d-flex flex-wrap flex-sm-nowrap p-2">
1490                        <div style="max-width: 12rem;" data-bind="class: doCheckEmptyData($data._bannerName()) ? '':'mega-dropdown-column'">
1491                            <!--ko if :  $data._list() != 0 -->
1492                            <!-- ko run: $data.mode='block' --><!-- /ko -->
1493                            <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko -->
1494                            <!-- /ko -->
1495                        </div>
1496                        <!--ko if :  !doCheckEmptyData($data._bannerName()) -->
1497                        <div class="mega-dropdown-column d-none d-lg-block text-center">
1498                            <img width="100%" data-bind="attr:{ src: GlobalSettingTranslateEnum.PathCategoryPicture + $data._bannerName(), 'alt': $data._code()}" alt="Menu">
1499                        </div>
1500                        <!-- /ko -->
1501                    </div>
1502                </div>
1503            </li>
1504        </ul>
1505    </li>
1506</ul>
1507<!-- /ko -->
1508<!-- Primary menu-->
1509<ul class="navbar-nav d-none d-lg-flex" data-bind="css:{'hide': m_listCategoryMenuHeader().length==0}, foreach: m_listCategoryMenuHeader">
1510    <li class="nav-item dropdown">
1511        <a class="nav-link dropdown-toggle" enable-href="false" href="#" data-bs-auto-close="outside" data-bind="attr:{href: doGetLinkCategory($data)}">
1512            <span class="categoryColor bolder" data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span>
1513        </a>
1514        <!-- ko if: $data._list().length!=0 -->
1515        <!-- ko run: $data.mode='' --><!-- /ko -->
1516        <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko -->
1517        <!-- /ko -->
1518    </li>
1519</ul>
1520
1521<!-- Tag menu -->
1522<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">
1523    <li class="nav-item me-2-Auto">
1524        <a class="btn btn-sm rounded-pill border px-3 categoryColor" enable-href="false" href="#" data-bind="
1525                               attr:{href: doGetLinkCategory($data), 'data-code': $data._code},
1526                               text: $data._name,
1527                               style:{'--data-categoryColor': $data._colorDesktopHex()}"></a>
1528    </li>
1529</ul>
1530<!-- /ko -->
1531
1532<!-- ko if: m_isMenuMobile() -->
1533<aside class="w-100 zindex-lg-5 pt-lg-5 d-lg-none" aria-modal="true" role="dialog">
1534    <div class="pt-2 d-none d-lg-block"></div>
1535
1536    <!--ko if :  m_listCategoryMenuDepartmentHeader().length!=0-->
1537    <ul class="nav nav-tabs nav-justified mt-4 mt-lg-5 mb-0" role="tablist" style="min-height: 3rem;">
1538        <li class="nav-item" role="presentation">
1539            <a class="nav-link fw-medium" href="#UI_departments" data-bs-toggle="tab" role="tab" aria-selected="false" tabindex="-1">
1540                الادارات
1541            </a>
1542        </li>
1543        <li class="nav-item" role="presentation">
1544            <a class="nav-link fw-medium active" href="#UI_headers" data-bs-toggle="tab" role="tab" aria-selected="true">
1545                قائمة
1546            </a>
1547        </li>
1548    </ul>
1549    <!-- /ko -->
1550
1551    <div class="offcanvas-body px-0 pt-3" data-simplebar="init" data-simplebar-auto-hide="false" style="height: calc( 100% - 35px);">
1552        <div class="tab-content">
1553
1554            <!--ko if :  m_listCategoryMenuDepartmentHeader().length!=0-->
1555            <div class="sidebar-nav tab-pane fade" id="UI_departments" role="tabpanel">
1556                <div class="widget widget-categories accordion " id="shop-categories" data-bind="foreach: m_listCategoryMenuDepartmentHeader">
1557                    <div class="accordion-item border-bottom accordion-header pe-2-Auto">
1558                        <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">
1559                            <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1560                            <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}">
1561                            </span>
1562                            <!-- /ko -->
1563                            <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>
1564
1565                        </button>
1566                        <!-- ko run: $data.mode='block' --><!-- /ko -->
1567                        <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko -->
1568                    </div>
1569                </div>
1570            </div>
1571            <!-- /ko -->
1572
1573            <div class="sidebar-nav tab-pane  fade active show" id="UI_headers" role="tabpanel">
1574                <div class="widget widget-categories accordion" data-bind="css:{'hide': m_listCategoryMenuHeader().length==0}, foreach: m_listCategoryMenuHeader">
1575                    <div class="accordion-item accordion-header">
1576                        <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">
1577                            <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1578                            <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}">
1579                            </span>
1580                            <!-- /ko -->
1581                            <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>
1582                        </button>
1583
1584                        <!--ko if :  $data._list().length!=0 -->
1585                        <!-- ko run: $data.mode='block' --><!-- /ko -->
1586                        <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko -->
1587                        <!-- /ko -->
1588
1589                    </div>
1590                </div>
1591            </div>
1592
1593        </div>
1594    </div>
1595</aside>
1596<!-- /ko -->
1597
1598
1599                </div>
1600            </div>
1601        </div>
1602
1603    </div>
1604</header>
1605
1606
1607    <!-- END HEADER -->
1608    <div style="min-height: 60vh;">
1609        <div id="UI_AjaxLoader" class="page-wrapper" style="display: none;">
1610            <div id="UI_LayoutBody" class="main_content">
1611                
1612
1613
1614
1615
1616<script type="application/javascript">
1617
1618    var m_handlerPageListFavorite;
1619
1620    doLoadScript(function () {
1621        m_handlerPageListFavorite = new Handler_PageListFavorite();
1622        doSetHandlerPageScroller(m_handlerPageListFavorite);
1623        m_handlerPageListFavorite.doInitData({"_page":"1"});
1624
1625        if (!ko.dataFor(document.getElementById('UI_LayoutBody')))
1626            ko.applyBindings(m_handlerPageListFavorite, document.getElementById('UI_LayoutBody'));
1627
1628
1629    }, "https://cdn.brandfull.com/Handlers/Pages/Handler_PageListFavorite.js");
1630</script>
1630
1631
1632<style>
1633
1634    @media only screen and (max-width:769px) {
1635        .table td, .table th {
1636            border-top: none;
1637        }
1638
1639        .wishlist_table .table td:nth-last-child(5n+4) {
1640            border-bottom: 1px solid black !important;
1641        }
1642
1643        .wishlist_table .table td:nth-child(5n+5) {
1644            border-bottom: none !important;
1645        }
1646    }
1647</style>
1648<main class="page-wrapper">
1649    <div class="page-title-overlap bg-BreadCrumb pt-4">
1650        <div class="container breadcrumbContainer">
1651            <div class="breadcrumbLink mb-3 ">
1652                <nav aria-label="breadcrumb">
1653                    <nav aria-label="breadcrumb">
1654                        <ol class="breadcrumb flex-lg-nowrap justify-content-start">
1655                            <li class="breadcrumb-item"><a class="text-nowrap" href="/" enable-href="false"><i class="ci-home"></i>الصفحة الرئيسية</a></li>
1656                            <li class="breadcrumb-item text-nowrap">
1657                                <a href="#">قائمة صفحة المفضلة</a>
1658                            </li>
1659                        </ol>
1660                    </nav>
1661                </nav>
1662            </div>
1663            <div class="breadcrumbTitle pe-lg-4-Auto ">
1664                <h1 class="h4 text-black mb-0">قائمة صفحة المفضلة</h1>
1665            </div>
1666        </div>
1667    </div>
1668    <div class="container pb-5 mb-2 mb-md-4">
1669        <div class="row">
1670            <!-- Content  -->
1671            <section class="col-12">
1672                <!-- Toolbar-->
1673                <div class="d-none d-lg-flex justify-content-between align-items-center pt-lg-3 pb-4 pb-lg-5 mb-lg-3">
1674                    <div class="d-flex flex-wrap">
1675                        <div class="d-flex align-items-center flex-nowrap me-3-Auto me-sm-4-Auto pb-3">
1676                            <span class="fs-sm text-black opacity-75 text-nowrap ms-2-Auto d-block" data-bind="html:'عرض: <b>' + m_paging.m_totalCount() + '</b> بند'">
1677                            </span>
1678                        </div>
1679                    </div>
1680                    <div class="d-flex pb-3">
1681                    </div>
1682                    <div class="d-flex pb-3">
1683                    </div>
1684                </div>
1685                <div class="row mx-n2 mt-2" id="UI_listObject">
1686                    <!-- ko if: m_listObject().length!=0 -->
1687                    <!--ko   foreach: m_listObject -->
1688                    <!-- ko run: $data.mode='grid' --><!-- /ko -->
1689                    <div class="col-lg-3 col-md-3 col-6 px-2 mb-4">
1690                        <!-- ko template: { name: 'Template_ItemComponent_ObjectDefault' , data:$data} --><!-- /ko -->
1691                    </div>
1692                    <!-- /ko -->
1693                    <!-- /ko -->
1694                    
1695<nav class="pt-2 justify-content-center" aria-label="Page navigation" data-bind="class: m_paging.m_pageCount() > 1? 'd-flex':'d-none'">
1696    <!-- ko if: $root.m_paging.m_previousPageActive() -->
1697    <ul class="pagination">
1698        <li class="page-item">
1699            <a aria-label="السابق" class="page-link" href="#" data-bind="click:  $root.doSeekListData.bind($root,$root.m_paging.m_currentPage() - 1)">
1700                <i class="me-2-Auto" data-bind="class: doGetCulture() =='en'? 'ci-arrow-left':'ci-arrow-right' "></i>
1701            </a>
1702        </li>
1703    </ul>
1704    <!-- /ko -->
1705    <ul class="pagination">
1706    <!-- ko foreach: $root.m_paging.m_getPages() -->
1707        <li class="page-item" data-bind="css: { active:  $root.m_paging.m_currentPageActive($data) }">
1708            <a class="page-link " data-bind="text:$data,click: $root.doSeekListData.bind($root,$data)  "></a>
1709        </li>
1710        <!-- /ko -->
1711    </ul>
1712    <!-- ko if: $root.m_paging.m_nextPageActive() -->
1713    <ul class="pagination">
1714        <li class="page-item">
1715            <a class="page-link" data-bind="click: $root.doSeekListData.bind($root,$root.m_paging.m_currentPage() +1)" href="#" aria-label="Next">
1716                <i class="ms-2-Auto" data-bind="class: doGetCulture() =='en'? 'ci-arrow-right':'ci-arrow-left' "></i>
1717            </a>
1718        </li>
1719    </ul>
1720    <!-- /ko -->
1721</nav>
1722                </div>
1723        
1724                <!-- ko if: m_listObject().length==0 -->
1725                <div class="align-items-center justify-content-center" style="text-align: center; margin: auto;">
1726    <span class="dataImage" style="margin:25px; background-position-y: -420px; height: 200px; width: 200px;background-position-x: -1px; background-image: url(https://cdn.brandfull.com/Media/BrandFull/images.png?version=639260136446764345)"></span>
1727    <h6>لا توجد بيانات في هذا المجال.</h6>
1728    <br />
1729</div>
1730
1731                <!-- /ko -->
1732            </section>
1733        </div>
1734    </div>
1735</main>
1736            </div>
1737        </div>
1738    </div>
1739    <!-- START FOOTER -->
1740    
1741<style>
1742    .codeInput {
1743        width: 32px;
1744        height: 32px;
1745        text-align: center;
1746        border: none;
1747        border-bottom: 1.5px solid #d2d2d2;
1748        margin: 0 10px;
1749    }
1750
1751    .codeInput:focus {
1752        border-bottom: 1.5px solid deepskyblue;
1753        outline: none;
1754    }
1755
1756    /* Shared content modal (#UI_slideModal): the body is Portal-authored HTML, so give the tags an
1757       admin actually types a sane default rather than leaving them at browser sizes. */
1758    .slideModal-body {
1759        font-size: .9rem;
1760        line-height: 1.7;
1761        color: #374151;
1762    }
1763
1764        .slideModal-body ul,
1765        .slideModal-body ol {
1766            padding-inline-start: 18px;
1767            margin-bottom: 0;
1768        }
1769
1770        .slideModal-body p:last-child {
1771            margin-bottom: 0;
1772        }
1773</style>
1774
1775
1776
1777<!-- Sign in / sign up / forgot Password modal-->
1778<div id="UI_sessionModal" class="modal fade noPadding" tabindex="-1" role="dialog">
1779    <div class="modal-dialog modal-dialog-centered" role="document">
1780        <div class="modal-content">
1781            <div class="modal-header bg-secondary">
1782                <ul class="nav nav-tabs card-header-tabs" role="tablist">
1783                    <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>
1784                    <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>
1785                </ul>
1786                <button class="btn-close adjustBtnClose" style="" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button>
1787            </div>
1788            <div class="modal-body tab-content py-4">
1789                <div id="UI_socialAccount" class="py-2">
1790                    <h3 class="d-inline-block align-middle fs-base fw-medium mb-2">مع حساب اجتماعي</h3>
1791                    <div class="row">
1792                            <div id="UI_buttonGoogle" class="col-md-6 my-1" style="height: 40px;"></div>
1793                            <div id="appleid-signin" class="col-md-6 my-1" style="height: 40px;" data-color="black" data-border="true" data-type="sign in"></div>
1794                    </div>
1795                </div>
1796                <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate id="signin-tab">
1797                    <div class="mb-3">
1798                        <label class="form-label" for="UI_emailModal">البريد الإلكتروني والهاتف</label>
1799                        <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>
1800                        <div data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div>
1801                        <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div>
1802                    </div>
1803                    <div class="mb-3">
1804                        <label class="form-label" for="UI_passwordModal">كلمة المرور الخاصة بك</label>
1805                        <div class="password-toggle">
1806                            <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">
1807                            <label class="password-toggle-btn" aria-label="Show/hide password">
1808                                <input class="password-toggle-check" type="checkbox"><span class="password-toggle-indicator"></span>
1809                            </label>
1810                        </div>
1811                        <div data-bind="style:{display:!doCheckEmptyData(m_errorStructUser._password())?'block':'none'} , text: m_errorStructUser._password" class="invalid-feedback"></div>
1812                    </div>
1813                    <div class="mb-3 d-flex flex-wrap justify-content-between">
1814                        <div class="mb-2" data-bind="class:'ar' == 'en'? 'form-check':'form-check-reverse'">
1815                        </div>
1816                        <a class="fs-sm" href="#" onclick="doShowModal('UI_forgotModal');" data-bs-dismiss="modal" aria-label="Close">هل نسيت كلمة المرور؟</a>
1817                    </div>
1818                    <button data-bind="click : doSignUser" class="btn btn-primary btn-shadow d-block w-100" type="button">تسجيل الدخول</button>
1819                </form>
1820                
1821                <form class="needs-validation tab-pane fade" autocomplete="off" novalidate id="signup-tab" novalidate>
1822                    <p class="list-unstyled fs-md">
1823                        أضف بريدك الإلكتروني أو هاتفك أدناه ، وسيتم إرسال رسالة للتحقق.
1824                    </p>
1825                    <div class="mt-4 bg-white">
1826                        <div class="mb-3">
1827                            <div class="d-flex justify-content-between">
1828                                <div class="col-8">
1829                                    <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>
1830
1831                                    <!-- ko if:  !doCheckEmptyData(m_errorStructUser._phone()) -->
1832                                    <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div>
1833                                    <!-- /ko -->
1834                                </div>
1835                                <div class="col-3">
1836                                    <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'">
1837                                    </select>
1838                                </div>
1839                            </div>
1840                            <div class="d-flex text-center my-4 align-items-center">
1841                                <hr class="w-25 mx-auto">
1842                                <span class="h6">أو</span>
1843                                <hr class="w-25 mx-auto">
1844                            </div>
1845                            <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>
1846                            <!-- ko if:  !doCheckEmptyData(m_errorStructUser._email()) -->
1847                            <div id="UI_errorEmailModal" data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div>
1848                            <!-- /ko -->
1849                        </div>
1850                        <div class=" mb-3" data-bind="class:'ar' == 'en'? 'form-check':'form-check-reverse'">
1851                            <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)">
1852                            <label class="form-check-label" for="UI_agreePage">
1853                                <span>أوافق على الشروط والسياسة</span>
1854                            </label>
1855
1856                            <a href="/About/TermsandCondition" target="_blank" enable-href="true" class="readMore">اقرأ</a>
1857                        </div>
1858                        <!-- ko if:  m_isAgree() -->
1859                        <button data-bind="click : $root.doForgetPassword.bind($root, true)" class="btn btn-primary w-100" type="button">ارسل الرمز</button>
1860                        <!-- /ko -->
1861
1862                    </div>
1863                </form>
1864
1865
1866                
1867            </div>
1868        </div>
1869    </div>
1870</div>
1871
1872
1873<div id="UI_forgotModal" class="modal fade" tabindex="-1" role="dialog">
1874    <div class="modal-dialog modal-dialog-centered" role="document">
1875        <div class="modal-content">
1876            <div class="modal-header bg-secondary">
1877                <ul class="nav nav-tabs card-header-tabs" role="tablist">
1878                    <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>
1879                </ul>
1880                <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button>
1881            </div>
1882            <div class="modal-body tab-content py-4">
1883                <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate>
1884                    <p class="fs-md">قم بتغيير كلمة المرور الخاصة بك في ثلاث خطوات سهلة. يساعد هذا في الحفاظ على أمان كلمة المرور الجديدة.</p>
1885                    <ol class="list-unstyled fs-md">
1886                        <li><span class="text-primary me-2-Auto">1.</span>املأ عنوان بريدك الإلكتروني أدناه.</li>
1887                        <li><span class="text-primary me-2-Auto">2.</span>سنرسل إليك رمزا مؤقتا عبر البريد الإلكتروني.</li>
1888                        <li><span class="text-primary me-2-Auto">3.</span>استخدم الرمز لتغيير كلمة المرور الخاصة بك على موقعنا الآمن.</li>
1889                    </ol>
1890                    <div class="py-2 mt-4">
1891                        <div class="mb-3">
1892                            <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>
1893                            <!-- ko if:  !doCheckEmptyData(m_errorStructUser._email()) -->
1894                            <div data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div>
1895                            <!-- /ko -->
1896                            <div class="d-flex text-center my-4 align-items-center">
1897                                <hr class="w-25 mx-auto">
1898                                <span class="h6">أو</span>
1899                                <hr class="w-25 mx-auto">
1900                            </div>
1901                            <div class="d-flex justify-content-between">
1902                                <div class="col-8">
1903                                    <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>
1904
1905                                </div>
1906                                <div class="col-3">
1907                                    <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'">
1908                                    </select>
1909                                </div>
1910                            </div>
1911                            <!-- ko if:  !doCheckEmptyData(m_errorStructUser._phone()) -->
1912                            <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div>
1913                            <!-- /ko -->
1914                        </div>
1915                        <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>
1916                    </div>
1917                </form>
1918            </div>
1919        </div>
1920    </div>
1921</div>
1922
1923
1924<div id="UI_validationModal" class="modal fade" tabindex="-1" role="dialog">
1925    <div class="modal-dialog modal-dialog-centered" role="document">
1926        <div class="modal-content">
1927            <div class="modal-header bg-secondary">
1928                <ul class="nav nav-tabs card-header-tabs" role="tablist">
1929                    <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>
1930                </ul>
1931                <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button>
1932            </div>
1933            <div class="modal-body tab-content py-4">
1934                <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate>
1935                    <!-- ko if:  !doCheckEmptyData(m_currentStructUser._email()) -->
1936                    <p class="fs-md" data-bind="text: 'يرجى التحقق من بريدك الإلكتروني' + ':  (' + m_currentStructUser._email() + ')' "></p>
1937                    <!-- /ko -->
1938                    <!-- ko if:  !doCheckEmptyData(m_currentStructUser._phone()) -->
1939                    <p class="fs-md" data-bind="text: 'يرجى التحقق من رقم هاتفك' + ':  (' + m_currentStructUser._phone() + ')' "></p>
1940                    <!-- /ko -->
1941                    <div class="mb-3">
1942                        <label class="form-label">أدخل الرمز الخاص بك</label>
1943                        <div class="form-control d-flex align-items-center  justify-content-center" dir="ltr" id='UI_sessionCodeInputs' data-bind=" css:{'is-invalid': !m_isVerifyed()}">
1944                            <input class="codeInput" id="UI_sessionCode1" type="text" inputmode="numeric" maxlength="1" autocomplete="one-time-code" />
1945                            <input class="codeInput" id="UI_sessionCode2" type="text" inputmode="numeric" maxlength="1" />
1946                            <input class="codeInput" id="UI_sessionCode3" type="text" inputmode="numeric" maxlength="1" />
1947                            <input class="codeInput" id="UI_sessionCode4" type="text" inputmode="numeric" maxlength="1" />
1948                        </div>
1949                        <!-- ko if:  !doCheckEmptyData(m_errorStructUser._code()) -->
1950                        <div id="UI_errorCodeModal" data-bind="text: m_errorStructUser._code" class="invalid-feedback"></div>
1951                        <!-- /ko -->
1952                        <!-- ko if:  !doCheckEmptyData(m_errorStructUser._phone) -->
1953                        <div id="UI_errorPhoneModal" data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div>
1954                        <!-- /ko -->
1955                    </div>
1956                    <div class="text-center py-2 px-3" style=" display: flow-root;">
1957                        <button class="btn btn-sm btn-primary col-md-6" data-bind="click : $root.doSendCode.bind($root)" type="button">إرسال</button>
1958                    </div>
1959                </form>
1960            </div>
1961        </div>
1962    </div>
1963</div>
1964
1965
1966<div id="UI_resetPasswordModal" class="modal fade" tabindex="-1" role="dialog">
1967    <div class="modal-dialog modal-dialog-centered" role="document">
1968        <div class="modal-content">
1969            <div class="modal-header bg-secondary">
1970                <ul class="nav nav-tabs card-header-tabs" role="tablist">
1971                    <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>
1972                </ul>
1973                <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button>
1974            </div>
1975            <div class="modal-body tab-content py-4">
1976                <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate>
1977                    <p>يمكنك تغيير كلمة المرور الخاصة بك لأسباب أمنية أو إعادة تعيينها إذا نسيتها.</p>
1978                    <!-- ko if: !doCheckEmptyData(m_errorStructUser._token()) -->
1979                    <div id="UI_errorToken" data-bind="text: m_errorStructUser._token" class="invalid-feedback"></div>
1980                    <!-- /ko -->
1981                    <!-- ko if: m_isSuccess()-->
1982                    <p>تم تحديث كلمة المرور الخاصة بك</p>
1983                    <!-- /ko -->
1984                    <!-- ko if : !m_isSuccess() -->
1985                    <input class="d-none" type="text" autocomplete="username" tabindex="-1" aria-hidden="true" data-bind="value: m_currentStructUser._email">
1986                    <div class="mb-3">
1987                        <label class="form-label" for="UI_resetPasswordH
1987ashModal">كلمة المرور الخاصة بك</label>
1988                        <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">
1989                        <div id="UI_errorPasswordModal" data-bind="text: m_errorStructUser._password" class="invalid-feedback"></div>
1990                    </div>
1991                    <div class="mb-3">
1992                        <label class="form-label" for="UI_resetConfirmPasswordModal">تأكيد كلمة المرور</label>
1993                        <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">
1994                        <div id="UI_errorConfirmPasswordModal" data-bind="text: m_errorStructUser._confirmation" class="invalid-feedback"></div>
1995                    </div>
1996                    <!-- /ko -->
1997                    <button data-bind="click: $root.doUpdatePassword.bind($root)" class="btn btn-primary btn-shadow d-block w-100" type="button">حفظ</button>
1998                </form>
1999            </div>
2000        </div>
2001    </div>
2002</div>
2003
2004
2005<div id="UI_successRegisterModalPopUp" class="modal fade" tabindex="-1">
2006    <div class="modal-dialog modal-dialog-centered" role="document">
2007        <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg">
2008            <div class="modal-header border-0 pb-0 px-4 pt-4">
2009                <h5 class="modal-title fw-bold text-primary mb-0">تسجيل!</h5>
2010                <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
2011            </div>
2012            <div class="modal-body text-center px-4 pt-3 pb-4">
2013                <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle"
2014                     style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);">
2015                    <div class="d-inline-flex align-items-center justify-content-center rounded-circle"
2016                         style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);">
2017                        <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i>
2018                    </div>
2019                </div>
2020                <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">تم تأكيد بياناتك.</p>
2021            </div>
2022        </div>
2023    </div>
2024</div>
2025
2026<div id="UI_popUpNewsLetterSubmit" class="modal fade" tabindex="-1">
2027    <div class="modal-dialog modal-dialog-centered" role="document">
2028        <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg">
2029            <div class="modal-header border-0 pb-0 px-4 pt-4">
2030                <h5 class="modal-title fw-bold text-primary mb-0">الرساله الاخباريه!</h5>
2031                <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
2032            </div>
2033            <div class="modal-body text-center px-4 pt-3 pb-4">
2034                <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle"
2035                     style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);">
2036                    <div class="d-inline-flex align-items-center justify-content-center rounded-circle"
2037                         style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);">
2038                        <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i>
2039                    </div>
2040                </div>
2041                <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">تم حفظ جهة الاتصال.</p>
2042            </div>
2043        </div>
2044    </div>
2045</div>
2046
2047
2048<div id="UI_slideModal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2049    <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" role="document">
2050        <div class="modal-content">
2051            <div class="modal-header bg-secondary">
2052                <ul class="nav nav-tabs card-header-tabs" role="tablist">
2053                    <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>
2054                </ul>
2055                <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
2056            </div>
2057            <div class="modal-body py-4">
2058                <div class="slideModal-body textAlignAuto" data-bind="html: m_currentSlideModal._description"></div>
2059
2060                <!-- ko ifnot: doCheckEmptyData(m_currentSlideModal._link()) -->
2061                <a class="btn btn-primary d-block w-100 mt-3" href="#" enable-href="true" data-bind="attr:{href: m_currentSlideModal._link}">
2062                    <!-- ko if: doCheckEmptyData(m_currentSlideModal._button()) -->أكثر<!-- /ko -->
2063                    <!-- ko ifnot: doCheckEmptyData(m_currentSlideModal._button()) --><span data-bind="text: m_currentSlideModal._button"></span><!-- /ko -->
2064                </a>
2065                <!-- /ko -->
2066            </div>
2067        </div>
2068    </div>
2069</div>
2070
2071
2072<!-- Cart Drawer Backdrop -->
2073<div id="UI_cartDrawerBackdrop" class="cart-drawer-backdrop" style="display:none"
2074     data-bind="visible: m_currentPopUpMessage._isVisible(), click: doCloseCartDrawer"></div>
2075
2076<!-- Cart Drawer -->
2077<div id="UI_cartDrawer" class="cart-drawer"
2078     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 }">
2079
2080    <!-- Drawer Header -->
2081    <!-- ko if: !(m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0) -->
2082    <div class="cart-drawer-header">
2083        <h5 class="mb-0 fw-bold">
2084            عربة التسوق
2085        </h5>
2086        <button class="btn-close" type="button" aria-label="Close" data-bind="click: doCloseCartDrawer"></button>
2087    </div>
2088    <!-- /ko -->
2089
2090    <!-- Added Item Notification -->
2091    <!-- ko if: m_currentPopUpMessage._popUpMessageType() >= 0 -->
2092    <div class="cart-drawer-alert" data-bind="css: doGetClassDrawerAlert()">
2093        <div class="d-flex align-items-center gap-2">
2094            <!-- ko if: m_currentPopUpMessage._pictureUrl() && !(m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 0) -->
2095            <img alt="" loading="lazy" class="rounded flex-shrink-0" style="width:40px; height:40px; object-fit:cover;" data-bind="attr:{ src: m_currentPopUpMessage._pictureUrl() }">
2096            <!-- /ko -->
2097            <div class="flex-grow-1 font-size-12" data-bind="html: doGetDrawerAlertMessage()"></div>
2098            <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0 -->
2099            <button class="btn-close flex-shrink-0" type="button" style="font-size: 10px;" aria-label="Close" data-bind="click: doCloseCartDrawer"></button>
2100            <!-- /ko -->
2101        </div>
2102        <!-- ko if: m_currentPopUpMessage._hasCouponShipment() -->
2103        <div class="shipteaser shipteaser-sm mt-2" data-bind="css: { 'shipteaser-done': !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() == 100 }" >
2104            <span class="shipteaser-icon"><i class="ci-delivery flipAuto"></i></span>
2105            <div class="shipteaser-body">
2106                <!-- ko if: m_currentPopUpMessage._hasPartialShipmentDiscount() -->
2107                <p class="shipteaser-text" data-bind="html: doGetShipmentTeaserMessage()"></p>
2108                <!-- /ko -->
2109
2110                <!-- ko if: !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() != 100 -->
2111                <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>
2112                <!-- /ko -->
2113
2114                <!-- ko if: !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() == 100 -->
2115                <p class="shipteaser-text">خدمة الشحن المجاني</p>
2116                <!-- /ko -->
2117
2118                <!-- ko if: m_currentPopUpMessage._drawLine() != 100 -->
2119                <div class="shipteaser-track" role="progressbar" aria-label="Free shipping progress">
2120                    <div class="shipteaser-fill" data-bind="style:{'width': m_currentPopUpMessage._drawLine()+'%'}"></div>
2121                </div>
2122                <!-- /ko -->
2123            </div>
2124        </div>
2125        <!-- /ko -->
2126    </div>
2127    <!-- /ko -->
2128
2129    <!-- Drawer Body - Cart Items -->
2130    <div class="cart-drawer-body">
2131        <!-- ko if: m_currentCart._listCartDetailModel().length != 0 -->
2132        <div data-bind="foreach: { data: m_showCartDrawer() ? doGetFilterCart() : [] }">
2133            <div class="cart-drawer-item">
2134                <div class="d-flex gap-2 align-items-start">
2135                    <div class="flex-shrink-0 position-relative">
2136                        <a class="cart-drawer-item-img d-block" enable-href="false" data-bind="attr:{href: doGetLinkObject($data._objectModel)}">
2137                            <img loading="lazy" data-bind="attr:{ src: doGetDefaultPictureByObject($data._objectModel, true), alt: $data._objectModel._name }">
2138                        </a>
2139                        <button class="cart-drawer-item-remove"
2140                                data-bind="click: $root.doRemoveCartDetail.bind($root, $data)"
2141                                type="button" aria-label="Remove">
2142                            <i class="ci-trash"></i>
2143                        </button>
2144                    </div>
2145                    <div class="flex-grow-1" style="min-width:0;">
2146                        <a enable-href="true" class="cart-drawer-item-title" data-bind="text: $data._objectModel._name, attr:{href: doGetLinkObject($data._objectModel)}"></a>
2147                        <div class="d-flex justify-content-between align-items-center mt-1">
2148                            <div class="text-accent fw-bold" data-bind="html: $root.doGetHtmlCartDetailPrice($data, true, true)"></div>
2149                            <!-- ko if: $data._cartDetailType() != CartDetailTypeEnum.FromBundle -->
2150                            <!-- ko if: $data._objectModel._objectSection() != ObjectSectionEnum.GiftCard && $data._objectModel._objectSection() != ObjectSectionEnum.Service -->
2151                            <div class="count-input count-input-xs rounded-pill flex-shrink-0">
2152                                <button type="button" class="btn btn-icon" data-bind="click: $root.doSetQuantity.bind($root, $data, QuantityActionEnum.Remove)">
2153                                    <span class="fw-bold">−</span>
2154                                </button>
2155                                <input autocomplete="off" type="number" class="form-control text-center" readonly="true" data-bind="value: $data._quantity">
2156                                <button type="button" class="btn btn-icon" data-bind="click: $root.doSetQuantity.bind($root, $data, QuantityActionEnum.Add)">
2157                                    <span class="fw-bold">+</span>
2158                                </button>
2159                            </div>
2160                            <!-- /ko -->
2161                            <!-- /ko -->
2162                        </div>
2163                        <!-- ko if: $data._objectModel._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.Preserved -->
2164                        <div class="cart-drawer-item-preorder d-flex align-items-center mt-1">
2165                            <i class="ci-truck flipAuto me-1-Auto" data-bind="css:{'icon-flip-horizontal': doGetCulture() =='en'}"></i>
2166                            <!-- ko if: doGetCountryShortNameByCurrentCompany() == 'sa' -->
2167                            <span data-bind="text: doFormatPreserved($data._objectModel._objectStockModel._datePreserved(), 15, doGetCulture())"></span>
2168                            <!-- /ko -->
2169                            <!-- ko if: doGetCountryShortNameByCurrentCompany() == 'ae' -->
2170                            <span data-bind="text: doFormatPreserved($data._objectModel._objectStockModel._datePreserved(), 7, doGetCulture())"></span>
2171                            <!-- /ko -->
2172                        </div>
2173                        <!-- /ko -->
2174                    </div>
2175                </div>
2176            </div>
2177        </div>
2178        <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 1 -->
2179        <div class="text-center py-2 border-top">
2180            <button type="button" class="btn btn-link p-0 text-decoration-none fw-semibold font-size-12"
2181                    style="color: rgba(var(--cz-primary-rgb));"
2182                    data-bind="click: function(){ m_drawerShortMode(false); }, text: 'عرض الجميع ' + doGetCartCount() + ' المنتجات'">
2183            </button>
2184        </div>
2185        <!-- /ko -->
2186        <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 0 -->
2187        <div class="px-3 pb-2">
2188            <a class="btn btn-sm d-block w-100 cart-drawer-checkout"
2189               href="/Checkout" enable-href="false"
2190               onclick="m_handlerSession.doCloseCartDrawer()"
2191               style="font-size: 12px; padding: 6px 12px;">
2192                <i class="ci-card me-2-Auto fs-sm align-middle flipAuto"></i>الدفع
2193            </a>
2194        </div>
2195        <!-- /ko -->
2196        <!-- /ko -->
2197
2198        <!-- ko if: m_currentCart._listCartDetailModel().length == 0 && !m_drawerShortMode() -->
2199        <div class="text-center py-5 px-3">
2200            <i class="ci-card-bag" style="font-size:48px; color:#ccc;"></i>
2201            <h6 class="mt-3 text-muted">لا توجد منتجات في سلة التسوق الخاصة بك.</h6>
2202        </div>
2203        <!-- /ko -->
2204    </div>
2205
2206    <!-- Drawer Footer -->
2207    <!-- ko if: m_currentCart._listCartDetailModel().length != 0 && !m_drawerShortMode() -->
2208    <div class="cart-drawer-footer pb-sm-5 pb-md-4">
2209        <div class="d-flex justify-content-between align-items-start mb-3">
2210            <div class="textAlignAuto">
2211                <span class="text-accent fw-semibold">مجموع</span>
2212                <span class="text-muted font-size-10">(تشمل ضريبة القيمة المضافة)</span>
2213                <div class="fs-lg fw-bold" style="color: var(--cz-heading-color, #222);" data-bind="html: $root.doCalcPriceDynamic(m_currentCart._total(), true)"></div>
2214            </div>
2215            <!-- ko if: doGetCartTotalSaved() > 0 -->
2216            <div class="font-size-11 text-success fw-semibold textAlignAuto" style="margin-top: 4px;">
2217                <i class="ci-star font-size-10"></i> لقد أنقذت
2218                <div class="fs-sm fw-bold" data-bind="html: $root.doCalcPriceDynamic(doGetCartTotalSaved(), true)"></div>
2219            </div>
2220            <!-- /ko -->
2221        </div>
2222        <a class="btn d-block w-100 cart-drawer-checkout mb-2" href="/Checkout" enable-href="false" onclick="m_handlerSession.doCloseCartDrawer()">
2223            <i class="ci-card me-2-Auto fs-base align-middle flipAuto"></i>الدفع
2224        </a>
2225    </div>
2226    <!-- /ko -->
2227</div>
2228
2229
2230
2231
2232
2233<script type="application/javascript">
2234    window.doRedirection = function () {
2235        if (window.location.pathname.indexOf("CreateSell") != -1)
2236            window.location = window.location.origin;
2237    }
2238
2239    // The notification dropdown renders a row per advertisement, and it is in the header of every
2240    // page — so the whole list was bound on every page load for a panel most visitors never open.
2241    // The markup only foreaches once this says so; the flag stays true afterwards, since a second
2242    // open should cost nothing.
2243    //
2244    // Filling it is deliberately separate from opening it. On desktop the panel is opened by CSS
2245    // alone (.dropdown:hover > .dropdown-menu in StyleCartzilla-Menu.css), which no click handler
2246    // ever sees — so hovering showed the panel with nothing in it. The wrapper calls this on
2247    // pointer enter, which is the earliest moment either path can start.
2248    window.doPrepareAdvertisement = function () {
2249        if (typeof m_handlerSession != "undefined")
2250            m_handlerSession.m_showAdvertisement(true);
2251    }
2252
2253    window.doOpenAdvertisement = function () {
2254        doPrepareAdvertisement();
2255        doJsShowMenu('UI_menuWebAdvertisement');
2256    }
2257
2258    // Mobile renders its own copy of the same list, inside a modal opened from the footer
2259    // toolbar. Same gate, same flag: the rows exist once either surface is asked for.
2260    window.doOpenAdvertisementModal = function () {
2261        doPrepareAdvertisement();
2262        doShowModal('UI_userModalAdvertisement');
2263    }
2264
2265    window.doOpenProfile = function () {
2266        if (doCheckUUID(m_handlerSession.m_currentUser._id())){
2267            if(window.innerWidth <= 992)
2268                doShowModal('UI_menuUserMobile');
2269            else {
2270                var el = document.querySelector('#UI_userSession .dropdown-menu');
2271                if (el) el.classList.toggle('show');
2272            }
2273        }
2274        else {
2275            doShowModal('UI_sessionModal');
2276        }
2277    }
2278
2279
2280    doLoadScript(function () {
2281        doJsPasswordVisibilityToggle();          // wire modal password eye toggles (login/register/reset)
2282        const sessionInputs = ["UI_sessionCode1", "UI_sessionCode2", "UI_sessionCode3", "UI_sessionCode4"];
2283        doInitCodeInput(sessionInputs, m_handlerSession.m_currentStructUser._code, m_handlerSession, m_handlerSession.doEventSendCode);
2284
2285        var googleClientID = '316328785783-gk72dnq33tchhr0kdrtidg7enq1arami.apps.googleusercontent.com';
2286        var googleBtn = document.getElementById("UI_buttonGoogle");
2287        if (googleClientID != "" && googleBtn) {
2288            if (window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth)
2289            {
2290                googleBtn.innerHTML =
2291                    '<button class="btn btn-outline-dark w-100">Sign in with Google</button>';
2292                googleBtn.onclick = async function () {
2293                    try {
2294                        // Native plugin reads serverClientId from google-services.json /
2295                        // GoogleService-Info.plist; web doesn't need to pass it.
2296                        var res = await window.Capacitor.Plugins.NativeAuth.signInWithGoogle({});
2297                        m_handlerSession.doGoogleCredentialResponse({ credential: res.idToken });
2298                    } catch (error) {
2299                        console.log(error);
2300                    }
2301                };
2302            }
2303            // Web (browser) Google Sign-In client is heavy (~69 KiB). Don't load it at
2304            // page load — defer to the first time the session modal opens. See
2305            // window.doInitGoogleSignIn + the shown.bs.modal listener below.
2306        }
2307
2308        var m_gsiLoaded = false;
2309        window.doInitGoogleSignIn = function () {
2310            if (m_gsiLoaded)
2311                return;
2312
2313            var googleClientID = '316328785783-gk72dnq33tchhr0kdrtidg7enq1arami.apps.googleusercontent.com';
2314            var googleBtn = document.getElementById("UI_buttonGoogle");
2315            var isNative = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth;
2316
2317            // Native wires googleBtn.onclick at page load and loads no web script — skip here.
2318            if (googleClientID == "" || !googleBtn || isNative)
2319                return;
2320
2321            m_gsiLoaded = true;
2322            doLoadScript(function () {
2323                try{
2324                    google.accounts.id.initialize({
2325                        client_id: googleClientID,
2326                        callback: m_handlerSession.doGoogleCredentialResponse
2327                    });
2328                    google.accounts.id.renderButton(
2329                        googleBtn,
2330                        { theme: "outline", size: "large" }  // customization attributes
2331                    );
2332                }
2333                catch(error){
2334                    console.log(error);
2335                }
2336
2337            }, "https://accounts.google.com/gsi/client");
2338        };
2339
2340        // The Google and Apple origins used to be preconnected from the head of every page, where
2341        // they were two handshakes nobody spent on a visit that never opens this modal. Warm them
2342        // here instead, on `show` rather than `shown`: the two doInit* handlers below fetch the SDKs
2343        // on `shown`, so this puts the connection one modal fade (~150-300 ms) ahead of the request
2344        // instead of in the same tick, which is the whole point of a preconnect.
2345        var m_signInWarmed = false;
2346        function doWarmSignInOrigins() {
2347            if (m_signInWarmed)
2348                return;
2349            m_signInWarmed = true;
2350
2351            var origins = ["https://accounts.google.com", "https://appleid.cdn-apple.com"];
2352            for (var w = 0; w < origins.length; w++) {
2353                var hint = document.createElement("link");
2354                hint.rel = "preconnect";
2355                hint.href = origins[w];
2356                hint.crossOrigin = "anonymous";
2357                document.head.appendChild(hint);
2358            }
2359        }
2360
2361        var sessionModalEl = document.getElementById("UI_sessionModal");
2362        if (sessionModalEl)
2363            sessionModalEl.addEventListener("show.bs.modal", doWarmSignInOrigins);
2364        if (sessionModalEl)
2365            sessionModalEl.addEventListener("shown.bs.modal", window.doInitGoogleSignIn);
2366
2367        var appleClientID = 'com.root.login.brandfull';
2368        var appleBtn = document.getElementById("appleid-signin");
2369        if (appleClientID != "" && appleBtn) {
2370            var capPlatform = (window.Capacitor && window.Capacitor.getPlatform) ? window.Capacitor.getPlatform() : "";
2371            var isNative = (capPlatform === "ios" || capPlatform === "android")
2372                           && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth;
2373
2374            if (isNative) {
2375                // iOS: ASAuthorization (bundle ID is the audience — pass {}).
2376                // Android: Custom Tab to appleid.apple.com, deep-link back via the
2377                // intent-filter on blendshome.com/auth/android.
2378                appleBtn.innerHTML =
2379                    '<button class="btn btn-dark w-100">Sign in with Apple</button>';
2380                appleBtn.onclick = async function () {
2381                    try {
2382                        var args = (capPlatform === "android")
2383                            ? { clientId: appleClientID, redirectUri: 'https://brandfull.com/auth/android' }
2384                            : {};
2385                        var res = await window.Capacitor.Plugins.NativeAuth.signInWithApple(args);
2386                        m_handlerSession.doAppleCredentialResponse(res.idToken);
2387                    } catch (error) {
2388                        console.log(error);
2389                    }
2390                };
2391            }
2392            // Web Apple Sign-In JS deferred to first modal open — see window.doInitAppleSignIn.
2393        }
2394
2395        var m_appleLoaded = false;
2396        window.doInitAppleSignIn = function () {
2397            if (m_appleLoaded)
2398                return;
2399
2400            var appleClientID = 'com.root.login.brandfull';
2401            var appleBtn = document.getElementById("appleid-signin");
2402            var capPlatform = (window.Capacitor && window.Capacitor.getPlatform) ? window.Capacitor.getPlatform() : "";
2403            var isNative = (capPlatform === "ios" || capPlatform === "android")
2404                           && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth;
2405
2406            // Native wires appleBtn.onclick at page load and loads no web script — skip here.
2407            if (appleClientID == "" || !appleBtn || isNative)
2408                return;
2409
2410            m_appleLoaded = true;
2411            doLoadScript(function () {
2412
2413                AppleID.auth.init({
2414                    clientId: appleClientID,
2415                    redirectURI: 'https://brandfull.com',
2416                    scope: 'name email',
2417                    usePopup: true,
2418                    onSuccess: (response) => console.log('responseApple - response', response),
2419                    onError: (error) => console.log('responseApple - error', error),
2420                });
2421
2422                document.addEventListener('AppleIDSignInOnSuccess', (event) => {
2423                    // Handle successful response.
2424                    console.log('AppleIDSignInOnSuccess', event.detail.authorization.id_token);
2425                    m_handlerSession.doAppleCredentialResponse(event.detail.authorization.id_token)
2426                });
2427
2428
2429                // Listen for authorization failures.
2430                document.addEventListener('AppleIDSignInOnFailure', (event) => {
2431                    // Handle error.
2432                    console.log('AppleIDSignInOnFailure', event);
2433                });
2434            }, "https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js");
2435        };
2436
2437        if (sessionModalEl)
2438            sessionModalEl.addEventListener("shown.bs.modal", window.doInitAppleSign
2438In);
2439    })
2440</script>
2440
2441
2442    
2443
2444<input autocomplete="off" style="visibility: hidden;display: none;" type="file" id="UI_addPicture" multiple accept="image/x-png,image/jpeg" />
2445<div id="UI_uploadImageModal" class="modal" tabindex="-1" role="dialog" style="z-index: 100000;">
2446    <div class="modal-dialog" style=" width: auto;">
2447        <div class="modal-content">
2448            <div class="modal-header">
2449                <div class="modal-title h4">  تحميل الصورة </div>
2450                <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'}">
2451                    <i class="ci-close"></i>
2452                </button>
2453            </div>
2454            <div class="modal-body pt-1 px-0 pb-0" id="UI_bodyImageModal">
2455                <div id="image_demo"></div>
2456            </div>
2457            <div class="modal-footer py-1">
2458                <div class="w-100" style="text-align: center;">
2459                    <button class="btn btn-primary crop_image py-1" id="crop_image">
2460                        <i class="ci-reduce"></i>
2461                        اضف صورة
2462                    </button>
2463                    <button class="btn btn-secondary RotateRight py-1">
2464                        <i class="ci-compare"></i>
2465                        دوران
2466                    </button>
2467                </div>
2468            </div>
2469        </div>
2470    </div>
2471</div>
2472
2473<style>
2474    /* Cropper look & feel — id-scoped so these win over micro-cropper.js's injected global rules */
2475    #UI_uploadImageModal .modal-dialog { max-width: 480px; }
2476    #UI_uploadImageModal .modal-content {
2477        border: 0;
2478        border-radius: 18px;
2479        overflow: hidden;
2480        box-shadow: 0 24px 60px -14px rgba(17, 20, 28, .38);
2481    }
2482    #UI_uploadImageModal .modal-body {
2483        background: linear-gradient(180deg, #f6f7f9 0%, #eef0f3 100%);
2484    }
2485    #UI_uploadImageModal .croppie-container { padding: 16px 0 6px; }
2486
2487    /* darkened surround + rounded stage */
2488    #UI_uploadImageModal .cr-boundary {
2489        border-radius: 14px;
2490        box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06);
2491    }
2492    /* crop window: soft white frame + subtle ring, keep Croppie's giant darken shadow */
2493    #UI_uploadImageModal .cr-viewport {
2494        border: 3px solid #fff;
2495        border-radius: 16px;
2496        box-shadow: 0 0 0 1px rgba(0, 0, 0, .18), 0 0 2000px 2000px rgba(17, 20, 28, .55);
2497    }
2498
2499    /* zoom slider */
2500    #UI_uploadImageModal .cr-slider-wrap { width: 82%; margin: 8px auto 18px; }
2501    #UI_uploadImageModal .cr-slider { padding: 10px 0; }
2502    #UI_uploadImageModal .cr-slider::-webkit-slider-runnable-track {
2503        height: 6px; border-radius: 6px; background: rgba(17, 20, 28, .14);
2504    }
2505    #UI_uploadImageModal .cr-slider::-webkit-slider-thumb {
2506        height: 20px; width: 20px; margin-top: -7px; border-radius: 50%;
2507        background: var(--theme-color, #fd5631); border: 2px solid #fff;
2508        box-shadow: 0 2px 6px rgba(0, 0, 0, .3); transition: transform .15s ease;
2509    }
2510    #UI_uploadImageModal .cr-slider:active::-webkit-slider-thumb { transform: scale(1.15); }
2511    #UI_uploadImageModal .cr-slider::-moz-range-track {
2512        height: 6px; border-radius: 6px; background: rgba(17, 20, 28, .14);
2513    }
2514    #UI_uploadImageModal .cr-slider::-moz-range-thumb {
2515        height: 20px; width: 20px; border-radius: 50%;
2516        background: var(--theme-color, #fd5631); border: 2px solid #fff;
2517        box-shadow: 0 2px 6px rgba(0, 0, 0, .3);
2518    }
2519
2520    /* footer actions */
2521    #UI_uploadImageModal .modal-footer {
2522        background: #fff; border-top: 1px solid rgba(0, 0, 0, .06); padding: 14px;
2523    }
2524    #UI_uploadImageModal .modal-footer .w-100 {
2525        display: flex; justify-content: center; gap: 10px;
2526    }
2527    #UI_uploadImageModal .modal-footer .btn {
2528        border-radius: 12px; padding: .55rem 1.15rem; font-weight: 600;
2529        display: inline-flex; align-items: center; gap: .4rem;
2530    }
2531    #UI_uploadImageModal .modal-footer .btn i { font-size: 1.05rem; }
2532</style>
2533
2534
2535<script type="application/javascript">
2536
2537    var image_crop = null;
2538    var image_handler = null;
2539    var image_id = null;
2540    var image_name = null;
2541    var image_param = null;
2542    var image_input = null;
2543    var image_object = null;
2544    var image_folder = null;
2545    var image_index = 0;
2546    var _cropperLoaded = false;
2547
2548    // Lazy-load micro-cropper.js on first use
2549    function doLoadCropper() {
2550        return new Promise(function (resolve) {
2551            if (_cropperLoaded || typeof Croppie !== 'undefined') { _cropperLoaded = true; resolve(); return; }
2552            var s = document.createElement('script');
2553            // Versioned like every other asset. This one builds its own 
2553<script> instead of
2554            // going through doLoadScript, so it does not inherit the cache-busting there and
2555            // a deploy would keep serving the previously cached copy.
2556            s.src = 'https://cdn.brandfull.com/_Js/micro-cropper.js?v=639260136226636726';
2557            s.onload = function () { _cropperLoaded = true; resolve(); };
2558            document.head.appendChild(s);
2559        });
2560    }
2561
2562    document.getElementById("UI_addPicture").addEventListener('change', function () {
2563        doShowModal('UI_uploadImageModal');
2564
2565        image_input = document.getElementById("UI_addPicture");
2566        image_index = image_input.files.length - 1;
2567        doLoadCropper().then(function () {
2568            doInitImageTool(image_input, image_object._dimension(), null, image_object._order(), null);
2569        });
2570    });
2571
2572    document.getElementById("UI_uploadImageModal").addEventListener('hidden.bs.modal', function() {
2573        document.getElementById("UI_addPicture").value = '';
2574    });
2575
2576    var m_currentPicture = null;
2577    window.doOpenCropper = function (handler, folder, item) {
2578        image_handler = handler;
2579        image_folder = folder;
2580        image_object = item;
2581        doLoadCropper().then(function () {
2582            if (item._binary()) {
2583                doShowModal('UI_uploadImageModal');
2584                doInitImageTool(document.getElementById("UI_addPicture"), item._dimension(), item._binary(), item._order(), item._name());
2585            }
2586            else if (item._name()) {
2587                doShowModal('UI_uploadImageModal');
2588                doInitImageTool(document.getElementById("UI_addPicture"), item._dimension(), image_folder + '/' + item._name(), item._order(), item._name());
2589            }
2590            else
2591                document.getElementById("UI_addPicture").click();
2592        });
2593    }
2594
2595    function doInitImageTool(input, dimension, imagepath = null, entityId = null, entityName = null) {
2596        var image_demo = document.querySelector('#image_demo');
2597        image_id = entityId;
2598        image_name = entityName;
2599        image_input = input;
2600        image_param = doGetParamPicture(dimension);
2601        if (image_crop != null)
2602            image_crop.destroy();
2603
2604        var xW = image_param.size.width / Math.max(image_param.size.height, image_param.size.width);
2605        image_param.viewport.width = image_param.viewport.width * xW;
2606        var xH = image_param.size.height / Math.max(image_param.size.height, image_param.size.width);
2607        image_param.viewport.height = image_param.viewport.height * xH;
2608        image_crop = new Croppie(image_demo, {
2609            showZoomer: true,
2610            enableResize: false,
2611            enableOrientation: true,
2612            enforceBoundary: true,
2613            mouseWheelZoom: true,
2614            enableExif: true,
2615            viewport: image_param.viewport,
2616            boundary: image_param.boundary
2617        });
2618
2619        var reader = new FileReader();
2620        reader.onload = function (event) {
2621            image_crop.bind({
2622                url: event.target.result,
2623            }).then(function () {
2624                image_crop.setZoom(0);
2625            });
2626        };
2627
2628        if (imagepath != null) {
2629            var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i;
2630            var isBase64Valid = base64Rejex.test(imagepath);
2631            if (isBase64Valid) {
2632                var url = "data:image/png;base64," + imagepath;
2633                var byteString = atob(url.split(',')[1]);
2634                var ab = new ArrayBuffer(byteString.length);
2635                var ia = new Uint8Array(ab);
2636                for (var i = 0; i < byteString.length; i++) {
2637                    ia[i] = byteString.charCodeAt(i);
2638                }
2639                var blob = new Blob([ab], { type: image_param.format ? 'image/' + image_param.format : 'image/jpeg' });
2640                reader.readAsDataURL(blob);
2641            } 
2642            else {
2643                var request = new XMLHttpRequest();
2644                request.open("POST", '/ConvertBinary?imageUrl=' + imagepath, true);
2645                request.onreadystatechange = function () {
2646                    if (request.readyState == 4)
2647                    {
2648                        if (request.status == 200) {
2649                            try {
2650                                response = JSON.parse(request.responseText);
2651                                var url = "data:image/png;base64," + response.imageData;
2652                                var byteString = atob(url.split(',')[1]);
2653                                var ab = new ArrayBuffer(byteString.length);
2654                                var ia = new Uint8Array(ab);
2655                                for (var i = 0; i < byteString.length; i++) {
2656                                    ia[i] = byteString.charCodeAt(i);
2657                                }
2658                                var blob = new Blob([ab], { type: image_param.format ? 'image/' + image_param.format : 'image/jpeg' });
2659                                reader.readAsDataURL(blob);
2660                            }
2661                            catch (error) { response = request.responseText; }
2662                        }
2663                    }
2664                };
2665                request.send();
2666            }
2667        }
2668        else if (input.files.length != 0) {
2669            reader.readAsDataURL(input.files[image_index]);
2670        }
2671    }
2672
2673    
2674    function doGetParamPicture(dimension) {
2675        var pSize = document.getElementById('UI_bodyImageModal').clientWidth;
2676
2677        var dimensions = dimension.split("x");
2678        if (dimensions.length != 2)
2679            dimensions = dimension.split("X");
2680        if (dimensions.length != 2)
2681            dimensions = dimension.split("*");
2682        return {
2683            size: { width: dimensions[0], height: dimensions[1] },
2684            viewport: { width: pSize * 0.75, height: pSize * 0.75, type: 'square' },
2685            boundary: { width: pSize - 30, height: pSize - 30 }
2686        };
2687    }
2688    function doClickCrop() {
2689        if (image_crop == null)
2690            return;
2691
2692        image_crop.result({
2693            type: 'canvas',
2694            size: image_param.size,
2695            format: image_param.format ? image_param.format : "jpeg",
2696            quality: image_param.quality ? image_param.quality.value : 0.5
2697        }).then(function (response) {
2698            var size = response.length / (1024 * 1024);
2699            if (response && size < 4) 
2700            {
2701                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]);
2702                if (image_index != 0 && image_object != null && image_object != undefined) {
2703                    image_index = image_index - 1;
2704                    setTimeout(doInitImageTool.bind(null, image_input, image_object._dimension(), null, image_object._order(), null), 250);
2705                }
2706                else
2707                    doHideModal('UI_uploadImageModal');
2708            }
2709        });
2710    }
2711    function doClickRotateRight() {
2712        if (image_crop != null)
2713            image_crop.rotate(90);
2714    }
2715
2716    document.querySelector("#crop_image").removeEventListener('click', doClickCrop);
2717    document.querySelector('#crop_image').addEventListener('click', doClickCrop);
2718
2719    document.querySelector(".RotateRight").removeEventListener('click', doClickRotateRight);
2720    document.querySelector('.RotateRight').addEventListener('click', doClickRotateRight);
2721    
2722</script>
2722
2723
2724
2725
2726
2727    
2728
2729
2730
2731
2732<script type="application/javascript">
2733    // Body lives in Tools/Cartzilla/Footer.ts -- the three app footers each carried their own
2734    // near-identical copy of it.
2735    //
2736    // Must go through doLoadScript: Footer.ts is compiled into script.min.js, which is fetched
2737    // asynchronously, so doInitLayoutFooter does not exist yet when this inline script parses.
2738    // Calling it bare threw "doInitLayoutFooter is not defined" on every page. doLoadScript is
2739    // defined by _LayoutScript, which _Layout renders well before this partial, and it is
2740    // idempotent -- the bundle is requested once and later callbacks fire immediately.
2741    doLoadScript(function () { doInitLayoutFooter(); });
2742</script>
2742
2743
2744<!-- Footer-->
2745
2746
2747<footer id="UI_LayoutFooter" class="footer bg-secondary" style="visibility: hidden;">
2748
2749
2750
2751    <div id="UI_social" class="bf-surfaceBand px-lg-3">
2752        <div class="container d-flex flex-md-row flex-sm-column py-sm-3 py-md-2 py-lg-3">
2753            <div class="col-md-6 col-12 text-center mx-auto">
2754                <h3 class="pb-1 text-accent mb-2">انضم إلى نشرتنا الإخبارية الآن</h3>
2755                <p class="fs-sm d-sm-none text-white">تلقي آخر التحديثات حول العروض الترويجية لمنتجاتنا</p>
2756
2757            </div>
2758            <div class="d-flex flex-wrap align-items-center col-md-6 col-12">
2759                <div class="input-group flex-nowrap">
2760                    <i class="ci-mail position-absolute top-50 translate-middle-y text-muted fs-base ms-3-Auto  zindex-10"></i>
2761                    <input autocomplete="email" class="form-floating form-control rounded-start-Auto" type="email" data-bind="value : m_emailNewsletter" placeholder="البريد الإلكتروني">
2762                    <button class=" btn btn-primary" type="button" data-bind="click : doSaveNewsletter">
2763                        ارسل
2764                    </button>
2765                </div>
2766                <!-- ko if:  !doCheckEmptyData(m_errorNewsletter()) -->
2767                <small class="text-danger" data-bind="text: m_errorNewsletter"></small>
2768                <!-- /ko -->
2769                <div class="subscription-status"></div>
2770            </div>
2771        </div>
2772
2773    </div>
2774
2775    <div class="p-lg-3 p-md-2 mb-2">
2776        <div class="mx-auto px-1 row" style="max-width: 80rem;">
2777
2778            <div id="UI_companyContact" class="col-md-4 col-12 order-sm-first">
2779
2780                <div class="form-text text-black">
2781                    <div class="widget widget-light pb-2 mb-md-4">
2782                        <!-- ko if:  !doCheckEmptyData(m_currentCompany._whatsappLink()) -->
2783                        <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">
2784                            <i class="ci-whatsapp font-size-20"></i>
2785                        </a>
2786                        <!-- /ko -->
2787                        <!-- ko if:  !doCheckEmptyData(m_currentCompany._facebookLink()) -->
2788                        <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">
2789                            <i class="ci-facebook font-size-20"></i>
2790                        </a>
2791                        <!-- /ko -->
2792                        <!-- ko if:  !doCheckEmptyData(m_currentCompany._twitterLink()) -->
2793                        <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">
2794                            <i class="ci-twitter font-size-20"></i>
2795                        </a>
2796                        <!-- /ko -->
2797                        <!-- ko if:  !doCheckEmptyData(m_currentCompany._instagramLink()) -->
2798                        <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">
2799                            <i class="ci-instagram font-size-20"></i>
2800                        </a>
2801                        <!-- /ko -->
2802                        <!-- ko if:  !doCheckEmptyData(m_currentCompany._snapchatLink()) -->
2803                        <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">
2804                            <i class="ci-snapchat font-size-20"></i>
2805                        </a>
2806                        <!-- /ko -->
2807                        <!-- ko if:  !doCheckEmptyData(m_currentCompany._tiktokLink()) -->
2808                        <a name="supporttiktok" class="btn-social bs-light bs-facebook me-1-Auto mb
2808-1" href="#" aria-label="tiktok" data-bind="attr:{href:m_currentCompany._tiktokLink}" target="_blank" enable-href="true" rel="noreferrer">
2809                            <i class="ci-tiktok font-size-20"></i>
2810                        </a>
2811                        <!-- /ko -->
2812                    </div>
2813                </div>
2814
2815
2816                <div class="d-grid col-12">
2817                    <div class="form-text  text-white me-2-Auto">
2818                        <i class="ci-location"></i>
2819                        <span data-bind="html: doGetAddress(m_currentCompany._addressModel, '</br>')">
2820                        </span>
2821                    </div>
2822                    <div class="d-flex flex-wrap text-white">
2823                        <div class="me-2-Auto widget-light">
2824                            <i class="ci-mail"></i>
2825                            <a href="#" class="widget-list-link d-inline " data-bind="attr:{href: 'mailto:'+ m_currentCompany._addressModel._email()}" target="_blank" enable-href="true" rel="noreferrer">
2826                                <b data-bind="text:m_currentCompany._addressModel._email"></b>
2827                            </a>
2828                        </div>
2829                        <div class="me-2-Auto widget-light widget-list-item">
2830                            <i class="ci-phone"></i>
2831                            <a href="#" class="widget-list-link d-inline" data-bind="attr:{href: 'tel:'+ m_currentCompany._addressModel._phone()}" target="_blank" enable-href="true" rel="noreferrer">
2832                                <b data-bind="text:m_currentCompany._addressModel._phone"></b>
2833                            </a>
2834                        </div>
2835                    </div>
2836
2837                </div>
2838
2839            </div>
2840
2841
2842            <div id="UI_companyInfo" class="col-md-4 col-12 px-md-0 mb-2 m-sm-3">
2843                <div class=" row mt-n1 form-text text-black mb-1">
2844                    <div class="col-3 ">
2845                        <a class="d-inline-block align-middle" href="#">
2846                            <!-- ko if:  !doCheckEmptyData(m_currentCompany._pictureModel._name()) -->
2847                            <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">
2848                            <!-- /ko -->
2849                        </a>
2850                    </div>
2851                    <div class="col-9">
2852                        <div class="form-text text-accent">
2853                            <strong class="font-size-16" data-bind="text: m_currentCompany._name()"></strong>
2854                        </div>
2855                        <div class="form-text text-white pb-2 mt-3">
2856                            <span class="" data-bind="text: m_currentCompany._description()"></span>
2857
2858                            <div class="d-flex mt-sm-2" data-bind="foreach: { data: m_handlerLayout.m_listCategoryMenuDepartmentFooter, as: 'subCategory' }">
2859                                <a class="col-2" href="#" enable-href="false" data-bind="attr:{ href: doGetLinkLoadMenu (subCategory, 'About')}">
2860                                    <!-- ko if: !doCheckEmptyData(subCategory._pictureName()) -->
2861                                    <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" />
2862                                    <!-- /ko -->
2863                                </a>
2864                            </div>
2865                        </div>
2866                    </div>
2867
2868                </div>
2869            </div>
2870
2871            <div id="UI_companyLinks" class="col-md-4 col-12 mb-sm-5" style="display:flex; flex-wrap: wrap">
2872                <!-- ko foreach: m_listCategoryMenuFooter -->
2873                <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() }">
2874                    <div class="widget textAlignAuto">
2875                        <div class="widget widget-links widget-light mb-4">
2876                            <div class="h6 widget-title text-accent  pb-1" data-bind="text: $data._name()"></div>
2877                            <!-- ko if: $data._list().length!=0 -->
2878                            <ul class="widget-list" data-bind="foreach: { data: $data._list(), as: 'subCategory' }">
2879                                <li class="widget-list-item">
2880                                    <a class="widget-list-link" href="#" enable-href="false" data-bind="attr:{ href: doGetLinkLoadMenu (subCategory, 'About')}">
2881                                        <!-- ko if: !doCheckEmptyData(subCategory._pictureName()) -->
2882                                        <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>
2883                                        <!-- /ko -->
2884                                        <span data-bind="text: subCategory._name"></span>
2885                                    </a>
2886                                </li>
2887                            </ul>
2888                            <!-- /ko -->
2889                        </div>
2890                    </div>
2891                </div>
2892                <!-- /ko -->
2893            </div>
2894
2895        </div>
2896    </div>
2897</footer>
2898
2899<!-- Back To Top Button-->
2900<a id="UI_topArraw" class="btn-scroll-top" onclick="doScrollToTop()">
2901    <span class="btn-scroll-top-tooltip text-muted fs-sm me-2">أعلى</span>
2902    <i class="btn-scroll-top-icon ci-arrow-up"></i>
2903</a>
2904
2905
2906<div id="UI_menuUserMobile" class="modal fade slide-up" tabindex="-1" role="dialog" aria-labelledby="UI_menuUserMobileLabel" aria-modal="true">
2907    <div class="modal-dialog" role="document">
2908        <div class="modal-content">
2909            <div class="modal-header border-bottom">
2910                <h5 class="modal-title fw-bold" id="UI_menuUserMobileLabel">قائمة الملف الشخصي</h5>
2911                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
2912            </div>
2913            <div class="modal-body p-4">
2914                <div class="widget widget-cart px-3 pt-2 pb-3 textAlignAuto">
2915                    <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Profile" data-bs-dismiss="modal" aria-label="Close">
2916                        <i class="ci-user opacity-60 me-2-Auto"></i>الملف الشخصي
2917                    </a>
2918                    <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Invoices" data-bs-dismiss="modal" aria-label="Close">
2919                        <i class="ci-basket opacity-60 me-2-Auto"></i>الفواتير
2920                    </a>
2921                    <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Supports" data-bs-dismiss="modal" aria-label="Close">
2922                        <i class="ci-help opacity-60 me-2-Auto"></i>تذاكر
2923                    </a>
2924                        <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Messages" data-bs-dismiss="modal" aria-label="Close">
2925                            <i class="ci-message opacity-60 me-2-Auto"></i>رسائل
2926                        </a>
2927
2928                    <div class="dropdown-divider"></div>
2929                    <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%2FAccount%2FFavorites')" data-bs-dismiss="modal" aria-label="Close">
2930                        <i class="ci-sign-out opacity-60 me-2-Auto"></i>تسجيل الخروج
2931                    </a>
2932                </div>
2933            </div>
2934        </div>
2935    </div>
2936</div>
2937
2938
2939<div id="UI_userModalAdvertisement" class="modal fade slide-up" tabindex="-1" role="dialog" aria-labelledby="UI_userModalAdvertisementLabel" aria-modal="true">
2940    <div class="modal-dialog" role="document">
2941        <div class="modal-content overflow-hidden">
2942            <div class="modal-header border-bottom">
2943                <h5 class="modal-title fw-bold" id="UI_userModalAdvertisementLabel">إشعار</h5>
2944                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
2945            </div>
2946            <div class="modal-body">
2947                <div class="widget widget-cart pt-2 pb-0">
2948                    <div class="d-flex align-items-center justify-content-between">
2949                        <div class="col-md-10">
2950
2951                            <!-- ko if: m_handlerLayout.m_isViewMobile() -->
2952                            <!-- ko if: m_enableNotifGrant() -->
2953                            <button id="UI_notifGrant" class="btn d-flex align-content-between align-items-center font-size-10 p-1 " onclick="doGetPermissionNotification()">
2954                                <i class="ci-settings me-2-Auto font-size-14 "></i>
2955                                <span class="form-check-label elide text-black fw-bolder heartbeat" for="UI_agreeWebPush">
2956                                    ابقني على اطلاع
2957                                </span>
2958                            </button>
2959                            <!-- /ko -->
2960                            <!-- ko if: m_enableNotifDenied() -->
2961                            <div id="UI_notifDenied" class="d-flex align-content-between align-items-center font-size-10 p-1 ">
2962                                <i class="ci-announcement me-2-Auto font-size-14  fw-bolder"></i>
2963                                <span class="form-check-label elide text-danger fw-bolder heartbeat">
2964                                    الإشعارات محجوبة. شغلها في إعدادات المتصفح لتحصل على تنبيهات.
2965                                </span>
2966                            </div>
2967                            <!-- /ko -->
2968                            <!-- /ko -->
2969                        </div>
2970                    </div>
2971
2972                    <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() : [] }">
2973    <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">
2974        <label class="form-text elide w-75 pointer" data-bind="click: $root.doSetTaged.bind($root, $data, true), text:$data._subject()"></label>
2975        <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>
2976    </div>
2977</div>
2978
2979                </div>
2980
2981            </div>
2982        </div>
2983    </div>
2984</div>
2985<div id="UI_footerMenu" class="handheld-toolbar position-fixed show" style="height: 3.5rem;">
2986    <div class="d-table table-layout-fixed w-100 pt-1" style="height: 100%">
2987
2988        <a name="footer-home" class="d-table-cell handheld-toolbar-item" href="/" rel="nofollow" enable-href="false" aria-label="go to home">
2989            <span class="handheld-toolbar-icon"><i class="ci-home"></i></span>
2990        </a>
2991        <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()">
2992            <span class="handheld-toolbar-icon"><i class="ci-user"></i></span>
2993        </a>
2994
2995
2996        <!-- ko if: doCheckUUID(m_currentUser._id()) -->
2997        <a name="footer-favorites" class="d-table-cell handheld-toolbar-item" aria-label="المفضله" href="/Account/Favorites" rel="nofollow" enable-href="false">
2998            <span class="handheld-toolbar-icon"><i class="ci-heart"></i></span>
2999        </a>
3000
3001        <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()">
3002            <span class="handheld-toolbar-icon">
3003                <!-- ko if: m_countAdvertisement() != 0 -->
3004                <span class="bg-danger font-size-10 text-white counterAdv" data-bind="text: m_countAdvertisement() > 99 ? '99+' : m_countAdvertisement()"></span>
3005                <!-- /ko -->
3006                <i class="ci-bell"></i>
3007            </span>
3008        </a>
3009        <!-- /ko -->
3010
3011    </div>
3012</div>
3013
3014
3015
3016    <!-- END FOOTER -->
3017    <div id="UI_preLoader" class="nav-progress" role="progressbar" aria-live="polite"
3018         style="display: none;"
3019         data-bind="visible: m_handlerLayout.m_customLoader()">
3020        <span class="nav-progress-bar"></span>
3021        <span class="seo-hidden">تحميل</span>
3022    </div>
3023    <!-- Google Tag Manager -->
3024<script>
3025    //we need it for GTMManager
3026    doLoadScript(function() {
3027        doSetThirdParty(window.dataLayer);
3028    });
3029</script>
3029
3030<!-- End Google Tag Manager -->
3031<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 3031-3032
3031
3032<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3032GTM-PTJJCWLL
vendor: 83 bytes, line 3032
3032" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
3033<!-- End Google Tag Manager (noscript) -->
3034
3035
3036
3037<noscript>
3038    <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=602667531455664&ev=PageView&noscript=1" />
3039</noscript>
3040<!-- End Meta Pixel Code -->
3041    <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">
3042  <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>
3043  <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>
3044</svg>
3045
3046
3047    
3048<script type="application/javascript">
3049    // What is left here is what is genuinely PER-REQUEST. m_jsonTranslate, jsonListCategory,
3050    // jsonListCompany and jsonListCountry have all moved to /InitData.js (HostController), because
3051    // none of them varies by anything but language: inlining them meant re-sending ~280 KB, the
3052    // category tree alone 270 KB of a 784 KB document, on every navigation and cached by nothing.
3053    // _LayoutScript requests that file first, ahead of the bundle, and the ready queue will not run a
3054    // callback until it has landed.
3055    //
3056    // Property writes onto GlobalSettingTranslateEnum. This one stays: it is resolved from the
3057    // request's companyID header, so it is not the same answer for two visitors on one deployment.
3058    // The body has to stay unevaluated until doSetEnumManager calls it -- GlobalSettingTranslateEnum
3059    // comes from /InitData.js along with the other 110 enums, and does not exist at this point in
3060    // the parse. (It was a script.min.js symbol until the enums moved; same answer either way.)
3061    function doApplySettingByCompany() {
3062        GlobalSettingTranslateEnum.PathCategoryPicture = "https://cdn.brandfull.com/Content/category/";
3063GlobalSettingTranslateEnum.PathObjectTypePicture = "https://cdn.brandfull.com/Content/objecttype/";
3064GlobalSettingTranslateEnum.PathObjectPicture = "https://cdn.brandfull.com/Content/object/";
3065GlobalSettingTranslateEnum.PathPaymentMethodPicture = "https://cdn.brandfull.com/Content/paymentMethod/";
3066GlobalSettingTranslateEnum.PathTrackerPicture = "https://cdn.brandfull.com/Content/tracker/";
3067GlobalSettingTranslateEnum.PathShipmentMethodPicture = "https://cdn.brandfull.com/Content/shipmentMethod/";
3068GlobalSettingTranslateEnum.PathCountryPicture = "https://cdn.brandfull.com/Content/country/";
3069GlobalSettingTranslateEnum.BaseUrlAPI = "https://brandfullsapi.azurewebsites.net";
3070GlobalSettingTranslateEnum.BaseUrl = "https://brandfull.com";
3071GlobalSettingTranslateEnum.Take = "8";
3072GlobalSettingTranslateEnum.CdnUrl = "https://cdn.brandfull.com";
3073GlobalSettingTranslateEnum.RedirectUrlPaymentWeb = "https://brandfull.com/Invoice/Edit";
3074GlobalSettingTranslateEnum.PathCompanyPicture = "https://cdn.brandfull.com/Content/company/";
3075GlobalSettingTranslateEnum.TicketLifeTime = "";
3076GlobalSettingTranslateEnum.AppName = "Brandfull";
3077GlobalSettingTranslateEnum.PathSlidePicture = "https://cdn.brandfull.com/Content/slide/";
3078GlobalSettingTranslateEnum.TakeObjectShop = "20";
3079GlobalSettingTranslateEnum.PathReplayPicture = "https://cdn.brandfull.com/Content/replay/";
3080GlobalSettingTranslateEnum.MessageServiceStatus = "true";
3081GlobalSettingTranslateEnum.SmartPricingServiceStatus = "";
3082GlobalSettingTranslateEnum.PathChatPicture = "https://cdn.brandfull.com/Content/chat/";
3083GlobalSettingTranslateEnum.PathDetailPicture = "https://cdn.brandfull.com/Content/detail/";
3084GlobalSettingTranslateEnum.PathColorPicture = "https://cdn.brandfull.com/Content/color/";
3085GlobalSettingTranslateEnum.LimitAddCartQuantity = "";
3086GlobalSettingTranslateEnum.MaketPlaceServiceStatus = "true";
3087GlobalSettingTranslateEnum.PathDivPicture = "https://cdn.brandfull.com/Content/divTemplate/";
3088GlobalSettingTranslateEnum.PathProfilePicture = "https://cdn.brandfull.com/Content/profile/";
3089GlobalSettingTranslateEnum.PathMessagePicture = "https://cdn.brandfull.com/Content/message/";
3090GlobalSettingTranslateEnum.PathSurveyPicture = "https://cdn.brandfull.com/Content/survey/";
3091GlobalSettingTranslateEnum.PathInvoiceDetailStatusPicture = "https://cdn.brandfull.com/Content/invoiceDetailStatus/";
3092
3093    }
3094</script>
3094
3095
3096
3097
3098<script id="Template_Empty" type="text/html"></script>
3098
3099    
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112<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="
3113                            html: doGenerateLabel($data._label()),
3114                            style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()},
3115                                        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="
3116                                html: doGenerateLabel($data._label()),
3117                                style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()},
3118                                        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
3118x"><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"
3119                       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}">
3120                                مباع
3121                            </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}">
3122                                لا يوجد مخزون
3123                            </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="
3124                                html: doGenerateLabel($data._label()),
3125                                style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()},
3126                                        attr:{href: doGetLinkCategory($data), 'data-divID':$parent.divID }"></a><!-- /ko --></div><!-- /ko --></div><!-- /ko --></div></script>
3126<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>
3126
3127<style>
3128        .product-card.shadow-none {
3129            box-shadow: unset !important;
3130            background-color: transparent;
3131        }
3132
3133        [lang="en"] .magicFlex a:last-of-type {
3134            margin-left: auto !important;
3135        }
3136
3137        [lang="ar"] .magicFlex a:last-of-type {
3138            margin-right: auto !important;
3139        }
3140
3141        .BigPicture , .BigPicture .position-sticky{
3142            height: 100%;
3143        }
3144
3145.brandRow {
3146            display: flex;
3147            align-items: center;
3148            gap: .35rem;
3149            margin-bottom: .25rem;
3150            min-height: 1.75rem;
3151        }
3152
3153            .brandRow-name {
3154                font-size: 11px;
3155                color: #444;
3156                letter-spacing: .3px;
3157                flex: 0 1 auto;
3158                min-width: 0;
3159                overflow: hidden;
3160                text-overflow: ellipsis;
3161                white-space: nowrap;
3162            }
3163
3164        @media screen and (max-width:992px) {
3165
3166            .BigPicture , .OnePicture{
3167                flex-direction: row !important;
3168                align-items: flex-end !important;
3169                padding-bottom: 0px !important;
3170            }
3171
3172            .BigPicture .position-sticky, .OnePicture .position-sticky {
3173                width: 45% !important;
3174                height: 100% !important;
3175                padding-right: 10px !important;
3176                padding-left: 10px !important;
3177            }
3178
3179            .BigPicture .position-sticky .bg-opacity-75, .OnePicture .position-sticky .bg-opacity-75 {
3180                width: calc(100% - 20px) !important;
3181            }
3182
3183           .BigPicture .card-body, .OnePicture .card-body {
3184                width: 50% !important;
3185            }
3186        }
3187</style>
3188<style>
3189        .AdvanceAuto {
3190            position: relative;
3191            margin-top: .5rem;
3192        }
3193
3194        .AdvanceAuto .AdvanceAuto_lead {
3195            width: 100%;
3196        }
3197
3198        .AdvanceAuto .AdvanceAuto_note {
3199            margin: -.75rem 0 0;
3200            text-align: center;
3201        }
3202
3203@media screen and (min-width: 768px) {
3204            .AdvanceAuto .bf-viewAll {
3205                position: absolute;
3206                top: 0;
3207                inset-inline-end: 0;
3208            }
3209        }
3210
3211        @media screen and (max-width: 767px) {
3212            .AdvanceAuto {
3213                display: flex;
3214                flex-direction: column;
3215                align-items: center;
3216            }
3217        }
3218</style>
3219
3220
3221
3222
3223</body>
3224</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.