PageSourceSearch

https://brandfull.com/Support/Create

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.