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