{"id":1717,"date":"2025-09-28T22:33:51","date_gmt":"2025-09-28T22:33:51","guid":{"rendered":"https:\/\/mythesis.co.nz\/?page_id=1717"},"modified":"2025-11-01T10:26:10","modified_gmt":"2025-11-01T10:26:10","slug":"book-binding-and-printing","status":"publish","type":"page","link":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/","title":{"rendered":".."},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><p>[vc_row wrap_container=&#8221;yes&#8221; full_height=&#8221;yes&#8221; is_section=&#8221;yes&#8221; section_skin=&#8221;parallax&#8221; remove_margin_top=&#8221;yes&#8221; remove_margin_bottom=&#8221;yes&#8221; remove_border=&#8221;yes&#8221; el_id=&#8221;section_6&#8243;][vc_column][vc_btn title=&#8221;Volume &amp; Custom Solutions&#8221; style=&#8221;outline&#8221; shape=&#8221;round&#8221; color=&#8221;sky&#8221; align=&#8221;center&#8221; css_params=&#8221;&#8221;]<h1 class=\"word-rotator slide short\" style=\"text-align:center;\" data-plugin-options=\"{'waittime': 2500, 'pauseOnHover': false}\"><span class=\"word-rotate-prefix\" style=\"\">Professional Book Binding in New Zealand<\/span> <span class=\"word-rotator-items has-bg\" style=\"font-family:&#039;Open Sans&#039;;color:#ffffff;background:#0088cc;\"><b class=\"active\"><\/b><\/span><\/h1>[vc_empty_space css_params=&#8221;&#8221;][vc_custom_heading text=&#8221;From custom covers to bulk volume orders \u2014 crafted locally with care and precision.&#8221; font_container=&#8221;tag:h4|font_size:21|text_align:center|line_height:1&#8243; use_theme_fonts=&#8221;yes&#8221; skin=&#8221;primary&#8221; el_class=&#8221;m-b-xl&#8221; css_params=&#8221;&#8221;][vc_empty_space height=&#8221;64px&#8221; css_params=&#8221;&#8221;][vc_row_inner el_class=&#8221;mb-5&#8243;][vc_column_inner offset=&#8221;vc_col-md-7&#8243;]<div class=\"porto-u-heading  wpb_custom_95aa9a11c17ad45cfabaf210d84ee7cc porto-u-ad87e2eaf3f9c495180fe0156ddf3eb0 \" data-appear-animation=\"fadeInUp\" data-appear-animation-delay=\"500\"><div class=\"porto-u-main-heading\"><h2   style=\"font-weight:700;margin-bottom: 16px;font-size:42px;line-height:58px;\">Affordable elegance for every story.<\/h2><\/div><div class=\"porto-u-sub-heading\" style=\"margin-bottom:20px;font-size:21px;line-height:38px;\">Perfect for family history books, memory albums, or personal portfolios.<\/div><style>.porto-u-ad87e2eaf3f9c495180fe0156ddf3eb0.porto-u-heading{text-align:left}<\/style><\/div>[vc_custom_heading text=&#8221;<\/p>\n<div style=``max-width:700px;``>\n<p style=``font-size:17px; line-height:1.8; color:#555; margin-bottom:18px;``>\n    Each book is handcrafted in<br \/>\n<strong style=``color:#2b2b2b;``>premium leatherette<\/strong> or<br \/>\n<strong style=``color:#2b2b2b;``>buckram cloth<\/strong>, blending timeless<br \/>\ncraftsmanship with modern design.<\/p>\n<p style=``font-size:17px; line-height:1.8; color:#555;``>\n    Whether you\u2019re preserving your<br \/>\n<em>family legacy<\/em> or creating a<br \/>\n<em>heartfelt gift<\/em>, our bindings combine<br \/>\n<strong>beauty<\/strong>, <strong>durability<\/strong>, and<br \/>\n<strong>lasting value<\/strong> \u2014<br \/>\n<span style=``color:#b22222; font-weight:600;``>all handcrafted locally in New Zealand.<\/span><\/div>\n<p>&#8221; font_container=&#8221;tag:p|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css_animation=&#8221;fadeInUp&#8221; css_params=&#8221;&#8221;][\/vc_column_inner][vc_column_inner offset=&#8221;vc_col-md-5&#8243;][vc_single_image image=&#8221;1397&#8243; img_size=&#8221;large&#8221; css=&#8221;&#8221; animation_delay=&#8221;200&#8243; animation_type=&#8221;fadeIn&#8221; css_params=&#8221;&#8221;][\/vc_column_inner][\/vc_row_inner][vc_empty_space height=&#8221;64px&#8221; css_params=&#8221;&#8221;]<div class=\"porto-u-heading mb-0 mb-md-3 pb-2  wpb_custom_95aa9a11c17ad45cfabaf210d84ee7cc porto-u-55ca8359258f9a412be7e73af65d2aac \" data-appear-animation=\"fadeInUp\" data-appear-animation-delay=\"600\"><div class=\"porto-u-main-heading\"><h2   style=\"font-weight:700;margin-bottom: 3px;font-size:28px;line-height:34px;\">Book Binding Solutions<\/h2><\/div><div class=\"porto-u-sub-heading\" style=\"font-weight:400;color: rgba(33,37,41,0.7);margin-bottom:8px;font-size:21px;\">Services<\/div><style>.porto-u-55ca8359258f9a412be7e73af65d2aac.porto-u-heading{text-align:center}<\/style><\/div>[vc_empty_space css_params=&#8221;&#8221;][vc_row_inner el_class=&#8221;content-grid no-padding&#8221;][vc_column_inner el_class=&#8221;content-grid-item&#8221; width=&#8221;1\/2&#8243; offset=&#8221;vc_col-md-4&#8243;]<div class=\"porto-sicon-box  vc_custom_1761981716286 px-3 px-md-5  wpb_custom_23f6194488daca8b275c7f3cf1c70867 style_3 top-icon\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-icon none\" style=\"font-size:32px;\"><i class=\"porto-icon-user-3\"><\/i><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"font-weight:600;font-size:21px;color:#212529;line-height:24px;\">Family History<\/h3><\/div> <!-- header --><div class=\"porto-sicon-description\" style=\"\">Turn generations of research into a beautifully printed and hand-bound genealogy book \u2014 the perfect way to preserve treasured stories and family heritage.<\/div> <!-- description --><\/div><!-- porto-sicon-box -->[\/vc_column_inner][vc_column_inner el_class=&#8221;content-grid-item&#8221; width=&#8221;1\/2&#8243; offset=&#8221;vc_col-md-4&#8243;]<div class=\"porto-sicon-box  vc_custom_1761981752720 px-3 px-md-5  wpb_custom_23f6194488daca8b275c7f3cf1c70867 style_3 top-icon\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-icon none\" style=\"font-size:32px;\"><i class=\"porto-icon-chrome\"><\/i><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"font-weight:600;font-size:21px;color:#212529;line-height:24px;\">Memoir & Novels<\/h3><\/div> <!-- header --><div class=\"porto-sicon-description\" style=\"\">Publish your memoirs or creative writing as a professionally bound hardback. Whether you\u2019re producing a single copy or a short run, we make it simple and personal.<\/div> <!-- description --><\/div><!-- porto-sicon-box -->[\/vc_column_inner][vc_column_inner el_class=&#8221;content-grid-item&#8221; width=&#8221;1\/2&#8243; offset=&#8221;vc_col-md-4&#8243;]<div class=\"porto-sicon-box  vc_custom_1761981844237 px-3 px-md-5  wpb_custom_23f6194488daca8b275c7f3cf1c70867 style_3 top-icon\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-icon none\" style=\"font-size:32px;\"><i class=\"porto-icon-bars\"><\/i><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"font-weight:600;font-size:21px;color:#212529;line-height:24px;\">Poetry Book<\/h3><\/div> <!-- header --><div class=\"porto-sicon-description\" style=\"\">\n<p data-start=\"1068\" data-end=\"1389\">Bring your words to life with a finely crafted poetry collection. Each volume is printed on premium paper and bound in elegant buckram or leatherette for a lasting impression.<\/p>\n<p><\/div> <!-- description --><\/div><!-- porto-sicon-box -->[\/vc_column_inner][vc_column_inner el_class=&#8221;content-grid-item&#8221; width=&#8221;1\/2&#8243; offset=&#8221;vc_col-md-4&#8243;]<div class=\"porto-sicon-box  vc_custom_1761981948289 px-3 px-md-5  wpb_custom_23f6194488daca8b275c7f3cf1c70867 style_3 top-icon\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-icon none\" style=\"font-size:32px;\"><i class=\"porto-icon-magnifier-remove\"><\/i><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"font-weight:600;font-size:21px;color:#212529;line-height:24px;\">Recipe Book<\/h3><\/div> <!-- header --><div class=\"porto-sicon-description\" style=\"\">Collect your favourite recipes into a durable, beautifully bound cookbook \u2014 a celebration of flavours and memories to pass down through generations.<\/div> <!-- description --><\/div><!-- porto-sicon-box -->[\/vc_column_inner][vc_column_inner el_class=&#8221;content-grid-item&#8221; width=&#8221;1\/2&#8243; offset=&#8221;vc_col-md-4&#8243;]<div class=\"porto-sicon-box  vc_custom_1761981923375 px-3 px-md-5  wpb_custom_23f6194488daca8b275c7f3cf1c70867 style_3 top-icon\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-icon none\" style=\"font-size:32px;\"><i class=\"porto-icon-wishlist\"><\/i><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"font-weight:600;font-size:21px;color:#212529;line-height:24px;\">This is Your Life Book<\/h3><\/div> <!-- header --><div class=\"porto-sicon-description\" style=\"\">Inspired by the classic BBC show, this unique keepsake captures a person\u2019s life story in photos, memories, and chapters \u2014 a perfect gift for milestonecelebrations. Bound in a handmade <strong data-start=\"1942\" data-end=\"1967\">red leatherette cover<\/strong> with gold-foil lettering, your custom \u201cThis Is Your Life\u201d book becomes a cherished symbol of love and remembrance.<\/div> <!-- description --><\/div><!-- porto-sicon-box -->[\/vc_column_inner][vc_column_inner el_class=&#8221;content-grid-item&#8221; width=&#8221;1\/2&#8243; offset=&#8221;vc_col-md-4&#8243;]<div class=\"porto-sicon-box  vc_custom_1761981865432 px-3 px-md-5  wpb_custom_23f6194488daca8b275c7f3cf1c70867 style_3 top-icon\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-icon none\" style=\"font-size:32px;\"><i class=\"porto-icon-smiling-baby\"><\/i><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"font-weight:600;font-size:21px;color:#212529;line-height:24px;\">Baby\u2019s First Chapter<\/h3><\/div> <!-- header --><div class=\"porto-sicon-description\" style=\"\">\n<p data-start=\"2121\" data-end=\"2418\">Celebrate new beginnings with a beautifully crafted keepsake for your baby\u2019s first memories \u2014 from hospital photos to first words and tiny milestones.<\/p>\n<p>&nbsp;<\/div> <!-- description --><\/div><!-- porto-sicon-box -->[\/vc_column_inner][\/vc_row_inner]<div class=\"porto-modal-input-wrapper \"><script>\r\n\t( function() {\r\n\t\tvar porto_init_modal = function() {\r\n\t\t\tvar selector = \"#solutions .btn\",\r\n\t\t\t\t$selector = jQuery(selector);\r\n\t\t\t$selector.addClass(\"porto-modal-trigger\");\r\n\t\t\t$selector.attr(\"data-trigger-id\", \"porto-modal-d24cba16686041cc04cfa67863ccf3be\");\r\n\t\t\t$selector.attr(\"data-type\", \"inline\");\r\n\t\t\t$selector.attr(\"data-overlay-class\", \"mfp-fade\");\r\n\t\t};\r\n\r\n\t\tif ( window.jQuery && jQuery(\"#solutions .btn\").length ) {\r\n\t\t\tporto_init_modal();\r\n\t\t} else {\r\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", porto_init_modal );\r\n\t\t}\r\n\t} )();\r\n\t<\/script><\/div><div id=\"porto-modal-d24cba16686041cc04cfa67863ccf3be\" class=\"mfp-hide \"><div class=\"porto-modal-content\"><\/div><\/div>[vc_row_inner animation_delay=&#8221;1100&#8243; el_class=&#8221;mx-0&#8243; css=&#8221;.vc_custom_1557009748261{background-color: #f7f7f7 !important;}&#8221; animation_type=&#8221;fadeInUp&#8221;][vc_column_inner el_class=&#8221;p-5&#8243; offset=&#8221;vc_col-md-9&#8243;][vc_custom_heading text=&#8221;<strong>Book Binding Options<\/strong>&#8221; font_container=&#8221;tag:h3|font_size:25|text_align:left|line_height:25px&#8221; use_theme_fonts=&#8221;yes&#8221; css_params=&#8221;&#8221;][vc_custom_heading text=&#8221;Handcrafted quality, flexible turnaround, and timeless finish \u2014 made in New Zealand.&#8221; font_container=&#8221;tag:p|text_align:left&#8221; use_theme_fonts=&#8221;yes&#8221; css_animation=&#8221;fadeInUp&#8221; css_params=&#8221;&#8221;][vc_separator color=&#8221;custom&#8221; style=&#8221;solid&#8221; accent_color=&#8221;rgba(0,0,0,0.06)&#8221;][vc_column_text css=&#8221;&#8221; el_class=&#8221;mb-0&#8243; css_params=&#8221;&#8221;]<\/p>\n<div class=\"row\">\n<div class=\"col-md-6\">\n<ul class=\"list list-icons list-primary mb-0\">\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Premium Buckram &amp; Leatherette Finish<\/li>\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Choose from 5 Elegant Cloth Colours<\/li>\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> 10 Standard Book Sizes Available<\/li>\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Custom Cover or Spine Text<\/li>\n<\/ul>\n<\/div>\n<div class=\"col-md-6\">\n<ul class=\"list list-icons list-primary mb-0\">\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Gold or Silver Lettering Options<\/li>\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Premium Quality Paper<\/li>\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Standard 5-Day Turnaround<\/li>\n<li class=\"ps-3 mb-2\"><i class=\"fas fa-chevron-right font-size-sm top-7\"><\/i> Rush 24-Hour Service Available<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>[\/vc_column_text][\/vc_column_inner][vc_column_inner el_class=&#8221;p-2 d-flex align-items-stretch&#8221; offset=&#8221;vc_col-md-3&#8243;][vc_column_text css=&#8221;.vc_custom_1761988714819{background-color: #ffffff !important;}&#8221; el_class=&#8221;h-100 mb-0 d-flex align-items-center justify-content-center text-center py-5&#8243; css_params=&#8221;&#8221;]<\/p>\n<div class=\"text-center\">\n<h4 class=\"font-weight-semibold ls-negative-1 mb-2\">Handcrafted Book Binding<\/h4>\n<div class=\"text-muted text-uppercase mb-1\" style=\"letter-spacing: .06em;\">From<\/div>\n<div class=\"d-flex justify-content-center align-items-start text-color-dark mb-3\" style=\"font-size: 56px; line-height: 1;\" aria-label=\"Price from 98 dollars\"><span class=\"font-weight-normal mt-1\" style=\"font-size: .4em;\">$<\/span><br \/>\n<span class=\"ms-1\">98<\/span><\/div>\n<p><a class=\"btn btn-dark font-weight-bold px-5 py-3 mb-3\" href=\"https:\/\/mythesis.co.nz\/index.php\/product\/15x15-leatherette-hardcover\/\"><br \/>\nOrder Now<\/a><\/p>\n<\/div>\n<p>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_accordion active_tab=&#8221;1&#8243; collapsible=&#8221;yes&#8221; type=&#8221;custom&#8221; size=&#8221;panel-group-lg&#8221; use_accordion=&#8221;true&#8221; el_class=&#8221;faq-list&#8221; heading_color=&#8221;#212529&#8243; heading_bg_color=&#8221;#ffffff&#8221;][vc_accordion_tab title=&#8221;(Square) 6&#215;6\u201d 15x15cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1290\" class=\"product type-product post-1290 status-publish first instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-600x600.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"15x15cm premium leatherette cover book \u2013 square photo album with custom binding\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book.png\" title=\"15x15cm Leatherette Cover Photo Book\" data-large_image_width=\"1024\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-600x600.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-400x400.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-560x560.png 560w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-367x367.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"15x15cm Leatherette Cover Photo Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t15\u00d715 cm Square Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/image-leatherette-hardcover\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/home-image-leatherette-copy-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">Image+Leatherette Hardcover<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/25x25-square-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"25x25cm premium leatherette cover book \u2013 durable square hardcover for custom projects and professional binding\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">25\u00d725 cm Square Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>98.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Compact &amp; elegant hardcover for albums and keepsakes<\/p>\n<p>Perfect for photo albums or family keepsakes. Available in premium leatherette or buckram finish \u2014 handcrafted in New Zealand with care and precision.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018419392\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018419392\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Square) 6x6'' \/ 15x15cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Square) 8x8'' \/ 20x20cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Buckram Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your book here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1290\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 6x6'' \\\/ 15x15cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 8x8'' \\\/ 20x20cm\",\"des\":\"\",\"price\":[\"70\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Buckram Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your book here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018419392',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018419392\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1290;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"98\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018419392');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab3dbf36\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1290\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-91vtisov resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The 15\u00d715 cm square book offers a clean, balanced format ideal for photo collections, guest books, or gift albums. Choose from our durable leatherette or buckram cloth cover for a classic finish that combines beauty and longevity. Every copy is crafted by hand in New Zealand.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-91vtisov');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1290 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Square) 8&#215;8&#8221; \/ 20x20cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1994\" class=\"product type-product post-1994 status-publish instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-600x600.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"20x20cm premium leatherette cover photo book \u2013 elegant square album with durable hard cover binding\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book.png\" title=\"20x20cm Leatherette Cover Photo Book\" data-large_image_width=\"1024\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-600x600.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-400x400.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-560x560.png 560w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-367x367.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"20x20cm Leatherette Cover Photo Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t20\u00d720 cm Square Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/35x28-portrait-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"35x28cm premium leatherette cover book \u2013 landscape hardcover ideal for portfolios, presentations, and professional reports\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">35\u00d728 cm Portrait Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<span class=\"product-link disabled\"><\/span>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>168.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Ideal for photo albums &amp; portfolios<\/p>\n<p>Timeless design for photos or creative projects \u2014 available in leatherette or buckram finish.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018419931\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018419931\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Square) 8x8'' \/ 20x20cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Square) 6x6'' \/ 15x15cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1994\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 8x8'' \\\/ 20x20cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 6x6'' \\\/ 15x15cm\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018419931',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018419931\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1994;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"168\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018419931');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab3e78e2\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1994\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-s52k2ivj resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The 20\u00d720 cm square layout gives space for photos and art while remaining portable. Handcrafted in NZ with your choice of leatherette or buckram cover for long-lasting quality.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-s52k2ivj');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1994 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Square) 10&#215;10&#8221; \/ 25x25cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1974\" class=\"product type-product post-1974 status-publish instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-600x600.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"25x25cm premium leatherette cover book \u2013 durable square hardcover for custom projects and professional binding\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book.png\" title=\"25x25cm Leatherette Cover Book\" data-large_image_width=\"1024\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-600x600.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-400x400.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-560x560.png 560w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-367x367.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"25x25cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t25\u00d725 cm Square Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/15x15-square-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/15x15cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"15x15cm premium leatherette cover book \u2013 square photo album with custom binding\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">15\u00d715 cm Square Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/30x30-square-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"30x30cm premium leatherette cover book \u2013 large square hardcover ideal for custom projects, portfolios, and professional binding\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">30\u00d730 cm Square Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>268.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Premium format for memories &amp; art<\/p>\n<p>Showcase your artwork or family stories in a premium 25\u00d725 cm hardcover book crafted in New Zealand.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018419439\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018419439\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your book            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Square) 10x10'' \/ 25x25cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Square) 12x12'' \/ 30x30cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Leatherette\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Leatherette<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload book?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your book here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1974\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your book\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 10x10'' \\\/ 25x25cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 12x12'' \\\/ 30x30cm\",\"des\":\"\",\"price\":[\"70\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Leatherette\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload book?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your book here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018419439',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018419439\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1974;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"268\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018419439');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab3f3552\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1974\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-isxd2d6e resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]This larger square format offers impact and elegance for creatives and families alike. Choose leatherette or buckram to preserve your stories with timeless quality.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-isxd2d6e');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1974 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Square) 12&#215;12&#8221; \/ 30x30cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1975\" class=\"product type-product post-1975 status-publish last instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-600x600.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"30x30cm premium leatherette cover book \u2013 large square hardcover ideal for custom projects, portfolios, and professional binding\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book.png\" title=\"0x30cm Leatherette Cover Book\" data-large_image_width=\"1024\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-600x600.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-400x400.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-560x560.png 560w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-367x367.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"0x30cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t30\u00d730 cm Square Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/25x25-square-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/25x25cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"25x25cm premium leatherette cover book \u2013 durable square hardcover for custom projects and professional binding\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">25\u00d725 cm Square Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/20x15-portrait-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"20x15cm premium leatherette cover book \u2013 durable portrait hardcover ideal for reports, portfolios, and custom publications\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">20\u00d715 cm Portrait Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>338.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Large album for weddings &amp; family history<\/p>\n<p>Create a bold presentation with our largest square book \u2014 available in leatherette or buckram finish.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018420678\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018420678\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Square) 12x12'' \/ 30x30cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Square) 10x10'' \/ 25x25cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1975\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 12x12'' \\\/ 30x30cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Square) 10x10'' \\\/ 25x25cm\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018420678',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018420678\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1975;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"338\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018420678');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab40ac74\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1975\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-p4kt3pcw resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The 30\u00d730 cm square book is perfect for wedding albums or family archives. Meticulously crafted in New Zealand for lasting elegance and strength.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-p4kt3pcw');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1975 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Portrait) 8&#215;6&#8221; \/ 20x15cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1976\" class=\"product type-product post-1976 status-publish first instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"900\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-600x900.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"20x15cm premium leatherette cover book \u2013 durable portrait hardcover ideal for reports, portfolios, and custom publications\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book.png\" title=\"20x15cm Leatherette Cover Book\" data-large_image_width=\"1024\" data-large_image_height=\"1536\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-600x900.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-400x600.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-367x551.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"20x15cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t20\u00d715 cm Portrait Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/30x30-square-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/30x30cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"30x30cm premium leatherette cover book \u2013 large square hardcover ideal for custom projects, portfolios, and professional binding\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">30\u00d730 cm Square Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/15x20-landscape-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"15x20cm premium leatherette cover book \u2013 landscape hardcover ideal for portfolios, reports, and professional projects\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">15\u00d720 cm Landscape Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>168.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Compact classic for stories or recipes<\/p>\n<p>Perfect for short stories or recipes \u2014 available in leatherette or buckram finish, crafted in New Zealand.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-177901842020\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-177901842020\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Portrait) 6x8'' \/ 15x20cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Landscape) 8x6'' \/ 20x15cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload book?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your book here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1976\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Portrait) 6x8'' \\\/ 15x20cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Landscape) 8x6'' \\\/ 20x15cm\",\"des\":\"\",\"price\":[\"70\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload book?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your book here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-177901842020',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-177901842020\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1976;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"168\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-177901842020');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab4158fd\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1976\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-u7fc2awy resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]This portable portrait book is ideal for memoirs, journals, and recipes. Choose your cover and turn your writing into a lasting keepsake.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-u7fc2awy');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1976 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Landscape) 6&#215;8&#8221; \/ 15x20cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1977\" class=\"product type-product post-1977 status-publish instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-600x400.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"15x20cm premium leatherette cover book \u2013 landscape hardcover ideal for portfolios, reports, and professional projects\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book.png\" title=\"15x20cm Leatherette Cover Book\" data-large_image_width=\"1536\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-600x400.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-400x267.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-367x245.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"15x20cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t15\u00d720 cm Landscape Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/20x15-portrait-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x15cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"20x15cm premium leatherette cover book \u2013 durable portrait hardcover ideal for reports, portfolios, and custom publications\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">20\u00d715 cm Portrait Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/20x28-landscape-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"20x28cm premium leatherette cover book \u2013 landscape hardcover ideal for reports, portfolios, and presentation materials\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">20\u00d728 cm Landscape Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>238.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Elegant horizontal layout for albums<\/p>\n<p>Perfect for landscape photos and artwork \u2014 choose leatherette or buckram binding, crafted in New Zealand.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018420593\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018420593\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Landscape) 8x6'' \/ 20x15cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Portrait) 6x8'' \/ 15x20cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1977\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Landscape) 8x6'' \\\/ 20x15cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Portrait) 6x8'' \\\/ 15x20cm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018420593',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018420593\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1977;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"238\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018420593');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab4208fe\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1977\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-g7jda68z resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The 15\u00d720 cm landscape format is ideal for albums and visual projects. Each book is hand-bound in New Zealand for lasting beauty and strength.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-g7jda68z');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1977 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Portrait) 11&#215;8&#8221; \/ 28x20cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1979\" class=\"product type-product post-1979 status-publish instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"900\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-600x900.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"28x20cm premium leatherette cover book \u2013 portrait hardcover ideal for reports, portfolios, and custom publications\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book.png\" title=\"28x20cm Leatherette Cover Book\" data-large_image_width=\"1024\" data-large_image_height=\"1536\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-600x900.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-400x600.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-367x551.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"28x20cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t28\u00d720 cm Portrait Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/20x28-landscape-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"20x28cm premium leatherette cover book \u2013 landscape hardcover ideal for reports, portfolios, and presentation materials\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">20\u00d728 cm Landscape Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/28x35-landscape-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"28x35cm premium leatherette cover book \u2013 landscape hardcover ideal for reports, portfolios, and creative publications\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">28\u00d735 cm Landscape Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>198.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>A4 portrait hardcover for projects &amp; theses<\/p>\n<p>Professional A4 portrait hardcover format \u2014 perfect for projects or family records, crafted in New Zealand.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018420502\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018420502\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Portrait) 11x8'' \/ 28x20cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Landscape) 8x11'' \/ 20x28cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 day<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy1\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy1<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1979\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Portrait) 11x8'' \\\/ 28x20cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"00\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Landscape) 8x11'' \\\/ 20x28cm\",\"des\":\"\",\"price\":[\"70\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 day\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy1\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018420502',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018420502\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1979;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"198\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018420502');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab42b800\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1979\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-ogxyw1hh resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]Our A4 portrait hardcover book is the most popular format for professional and personal projects. Choose leatherette or buckram for a refined finish that balances strength and style.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-ogxyw1hh');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1979 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Landscape) 8&#215;11&#8221; \/ 20x28cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1978\" class=\"product type-product post-1978 status-publish last instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-600x400.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"20x28cm premium leatherette cover book \u2013 landscape hardcover ideal for reports, portfolios, and presentation materials\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book.png\" title=\"20x28cm Leatherette Cover Book\" data-large_image_width=\"1536\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-600x400.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-400x267.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-367x245.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"20x28cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x28cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t20\u00d728 cm Landscape Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/15x20-landscape-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/15x20cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"15x20cm premium leatherette cover book \u2013 landscape hardcover ideal for portfolios, reports, and professional projects\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">15\u00d720 cm Landscape Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/28x20-portrait-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"28x20cm premium leatherette cover book \u2013 portrait hardcover ideal for reports, portfolios, and custom publications\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">28\u00d720 cm Portrait Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>268.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>A4 landscape layout for photo books<\/p>\n<p>Wide-format hardcover book for albums or visual projects \u2014 crafted in New Zealand.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018420229\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018420229\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Landscape) 8x11'' \/ 20x28cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Portrait) 11x8'' \/ 28x20cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 day<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 days<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 day<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 days<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Buckram Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1978\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Landscape) 8x11'' \\\/ 20x28cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"00\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Portrait) 11x8'' \\\/ 28x20cm\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 day\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 days\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Buckram Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018420229',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018420229\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1978;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"268\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018420229');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab436038\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1978\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-m5o6b97a resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The A4 landscape layout offers a cinematic presentation for photos and design projects. Choose from leatherette or buckram binding for a professional, handcrafted finish.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-m5o6b97a');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1978 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Portrait) 14&#215;11&#8221; \/ 35x28cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1981\" class=\"product type-product post-1981 status-publish first instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"900\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-600x900.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"35x28cm premium leatherette cover book \u2013 landscape hardcover ideal for portfolios, presentations, and professional reports\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book.png\" title=\"35x28cm Leatherette Cover Book\" data-large_image_width=\"1024\" data-large_image_height=\"1536\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-600x900.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-400x600.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-367x551.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"35x28cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t35\u00d728 cm Portrait Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/28x35-landscape-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"28x35cm premium leatherette cover book \u2013 landscape hardcover ideal for reports, portfolios, and creative publications\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">28\u00d735 cm Landscape Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/20x20-square-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/20x20cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"20x20cm premium leatherette cover photo book \u2013 elegant square album with durable hard cover binding\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">20\u00d720 cm Square Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>298.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Large display book for art or history<\/p>\n<p>Our largest portrait format for visual projects \u2014 crafted in New Zealand with leatherette or buckram binding.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018420392\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018420392\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Portrait) 14x11'' \/ 35x28cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Landscape) 11x14'' \/ 28x35cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 days<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 days<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 days<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 days<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Leatherette Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Gold Front + Back Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Gold Front Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Line 1 for Backcover            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Line 2 for Backcover            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Line 3 for Backcover            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Line 3 here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Line 4 for Backcover            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type line 4 here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Books<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1981\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Portrait) 14x11'' \\\/ 35x28cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Landscape) 11x14'' \\\/ 28x35cm\",\"des\":\"\",\"price\":[\"70\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 days\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 days\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Leatherette Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"4.5\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Gold Front + Back Cover\",\"des\":\"\",\"price\":[\"19.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Gold Front Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Line 1 for Backcover\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Line 2 for Backcover\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Line 3 for Backcover\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Line 3 here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Line 4 for Backcover\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type line 4 here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Books\",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018420392',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018420392\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1981;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"298\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018420392');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab43e6c5\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1981\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-yrz3n577 resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The 35\u00d728 cm portrait book is perfect for art collections and family records. Choose buckram or leatherette for a premium finish that endures time and touch.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-yrz3n577');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1981 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][vc_accordion_tab title=&#8221;(Landscape) 11&#215;14&#8221; \/ 28x35cm&#8221;]<div class=\"woocommerce\">\t\t\t<div class=\"single-product\" data-product-page-preselected-id=\"0\">\n\t\t\t\t<div class=\"woocommerce-notices-wrapper\"><\/div>\r\n<div id=\"product-1980\" class=\"product type-product post-1980 status-publish instock product_cat-book-binding has-post-thumbnail taxable shipping-taxable purchasable product-type-simple product-layout-default\">\r\n\r\n\t<div class=\"product-summary-wrap\">\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t<div class=\"summary-before col-md-6\">\r\n\t\t\t\t\t\t\t<div class=\"labels\"><\/div><div class=\"woocommerce-product-gallery woocommerce-product-gallery--with-images images\">\r\n\t<div class=\"woocommerce-product-gallery__wrapper\">\r\n<div class=\"product-images images\">\r\n\t<div class=\"product-image-slider owl-carousel show-nav-hover has-ccols ccols-1\"><div class=\"img-thumbnail\"><div class=\"inner\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"400\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-600x400.png\" class=\"woocommerce-main-image wp-post-image\" alt=\"28x35cm premium leatherette cover book \u2013 landscape hardcover ideal for reports, portfolios, and creative publications\" href=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book.png\" title=\"28x35cm Leatherette Cover Book\" data-large_image_width=\"1536\" data-large_image_height=\"1024\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-600x400.png 600w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-400x267.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-367x245.png 367w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/div><\/div><\/div><span class=\"zoom\" data-index=\"0\"><i class=\"porto-icon-plus\"><\/i><\/span><\/div>\r\n\r\n<div class=\"product-thumbnails thumbnails\">\r\n\t<div class=\"product-thumbs-slider owl-carousel has-ccols ccols-4\"><div class=\"img-thumbnail\"><img decoding=\"async\" class=\"woocommerce-main-thumb img-responsive\" alt=\"28x35cm Leatherette Cover Book\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x35cm-Leatherette-Cover-Book-300x300.png\" \/><\/div><\/div><\/div>\r\n\t<\/div>\r\n<\/div>\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"summary entry-summary col-md-6\">\r\n\t\t\t\t\t\t\t<h2 class=\"product_title entry-title show-product-nav\">\r\n\t\t28\u00d735 cm Landscape Hardcover Book\t<\/h2>\r\n<div class=\"product-nav\">\t\t<div class=\"product-prev\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/28x20-portrait-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/28x20cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"28x20cm premium leatherette cover book \u2013 portrait hardcover ideal for reports, portfolios, and custom publications\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">28\u00d720 cm Portrait Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t\t\t<div class=\"product-next\">\r\n\t\t\t<a href=\"https:\/\/mythesis.co.nz\/index.php\/product\/35x28-portrait-hardcover-book\/\">\r\n\t\t\t\t<span class=\"product-link\"><\/span>\r\n\t\t\t\t<span class=\"product-popup\">\r\n\t\t\t\t\t<span class=\"featured-box\">\r\n\t\t\t\t\t\t<span class=\"box-content\">\r\n\t\t\t\t\t\t\t<span class=\"product-image\">\r\n\t\t\t\t\t\t\t\t<span class=\"inner\">\r\n\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/10\/35x28cm-Leatherette-Cover-Book-150x150.png\" class=\"attachment-150x150 size-150x150 wp-post-image\" alt=\"35x28cm premium leatherette cover book \u2013 landscape hardcover ideal for portfolios, presentations, and professional reports\" \/>\t\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t\t<span class=\"product-details\">\r\n\t\t\t\t\t\t\t\t<span class=\"product-title\">35\u00d728 cm Portrait Hardcover Book<\/span>\r\n\t\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t\t<\/span>\r\n\t\t\t\t\t<\/span>\r\n\t\t\t\t<\/span>\r\n\t\t\t<\/a>\r\n\t\t<\/div>\r\n\t\t<\/div><p class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/span>368.00<\/bdi><\/span><\/p>\n\r\n<div class=\"description woocommerce-product-details__short-description\">\r\n\t<p>Oversized hardcover for portfolios &amp; projects<\/p>\n<p>Make a statement with our largest landscape format \u2014 available in leatherette or buckram finish.<\/p>\n<\/div>\r\n<div class=\"product_meta\">\r\n\r\n\t\r\n\t\t\r\n\t<span class=\"posted_in\">Category: <a href=\"https:\/\/mythesis.co.nz\/index.php\/product-category\/book-binding\/\" rel=\"tag\">Book Binding<\/a><\/span>\r\n\t\r\n\t\r\n<\/div>\r\n\r\n\t\r\n\t<form class=\"cart\" action=\"\" method=\"post\" enctype='multipart\/form-data'>\r\n\t\t<div class=\"nbo-wrapper  wrapper-type-1\">\n<style>\n    \/* tipTip *\/\n    #tiptip_holder {\n        display: none;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 9999999999;\n    }\n    #tiptip_holder.tip_top {\n        padding-bottom: 5px;\n    }\n    #tiptip_holder.tip_bottom {\n        padding-top: 5px;\n    }\n    #tiptip_holder.tip_right {\n        padding-left: 5px;\n    }\n    #tiptip_holder.tip_left {\n        padding-right: 5px;\n    }\n    #tiptip_content {\n        font-size: 11px;\n        color: #fff;\n        text-shadow: 0 0 2px #000;\n        padding: 4px 8px;\n        border: 1px solid rgba(255,255,255,0.25);\n        background-color: rgb(25,25,25);\n        background-color: rgba(25,25,25,0.92);\n        background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));\n        border-radius: 3px;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        box-shadow: 0 0 3px #555;\n        -webkit-box-shadow: 0 0 3px #555;\n        -moz-box-shadow: 0 0 3px #555;\n    }\n    #tiptip_arrow, #tiptip_arrow_inner {\n        position: absolute;\n        border-color: transparent;\n        border-style: solid;\n        border-width: 6px;\n        height: 0;\n        width: 0;\n    }\n    .rtl #tiptip_arrow{\n        right:50%;\n        margin-right:-6px\n    }\n    #tiptip_holder.tip_top #tiptip_arrow {\n        border-top-color: #fff;\n        border-top-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow {\n        border-bottom-color: #fff;\n        border-bottom-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_right #tiptip_arrow {\n        border-right-color: #fff;\n        border-right-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_left #tiptip_arrow {\n        border-left-color: #fff;\n        border-left-color: rgba(255,255,255,0.35);\n    }\n    #tiptip_holder.tip_top #tiptip_arrow_inner {\n        margin-top: -7px;\n        margin-left: -6px;\n        border-top-color: rgb(25,25,25);\n        border-top-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_top #tiptip_arrow_inner{\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-top: -5px;\n        margin-left: -6px;\n        border-bottom-color: rgb(25,25,25);\n        border-bottom-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_bottom #tiptip_arrow_inner {\n        margin-right:-6px;\n    }\n    #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -5px;\n        border-right-color: rgb(25,25,25);\n        border-right-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_right #tiptip_arrow_inner {\n        margin-right:-5px;\n    }\n    #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-top: -6px;\n        margin-left: -7px;\n        border-left-color: rgb(25,25,25);\n        border-left-color: rgba(25,25,25,0.92);\n    }\n    .rtl #tiptip_holder.tip_left #tiptip_arrow_inner {\n        margin-right:-7px;\n    }\n    @media screen and (-webkit-min-device-pixel-ratio:0) {\n        #tiptip_content {\n            padding: 4px 8px 5px 8px;\n            background-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_bottom #tiptip_arrow_inner { \n            border-bottom-color: rgba(45,45,45,0.88);\n        }\n        #tiptip_holder.tip_top #tiptip_arrow_inner { \n            border-top-color: rgba(20,20,20,0.92);\n        }\n    }\n    .nbo-disabled {\n        opacity: 0.3;\n        pointer-events: none;\n    }\n    .nbo-prevent-pointer {\n        pointer-events: none;\n    }\n    .nbd-help-tip {\n        vertical-align: middle;\n        cursor: help;\n        margin: -2px -24px 0 5px;\n        line-height: 1;\n        color: #fff !important;\n        background: #333333;\n        border-radius: 50%;\n        display: inline-block;\n        font-size: 10px;\n        font-style: normal;\n        height: 12px;\n        position: relative;\n        width: 12px;  \n        z-index: 2;\n    }\n    .nbd-help-tip::after {\n        font-family: monospace;\n        speak: none;\n        font-weight: 400;\n        text-transform: none;\n        line-height: 1;\n        -webkit-font-smoothing: antialiased;\n        text-indent: 0px;\n        position: absolute;\n        top: 1px;\n        left: 0px;\n        width: 100%;\n        height: 100%;\n        text-align: center;\n        content: \"i\";\n        cursor: help;\n        font-variant: normal;\n        margin: 0px;\n    }\n    .rtl .nbd-help-tip::after {\n        top:0;\n        right:0;\n    }\n    .rtl .nbd-help-tip {\n        margin: 0 9px 0 0;\n    }\n    \/* End tipTip *\/ \n    \/* nbd-radio *\/\n    @keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    }    \n    @-webkit-keyframes ripple {\n        0% {\n            box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0);\n        }\n        50% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0.1);\n        }\n        100% {\n            box-shadow: 0px 0px 0px 15px rgba(0, 0, 0, 0);\n        }\n    } \n    .nbd-radio input[type=\"radio\"]:checked + label:before,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:before {\n        border-color: #404762;\n        animation: ripple 0.2s linear forwards;\n    }\n    .nbd-radio input[type=\"radio\"]:checked + label:after,\n    .nbo-sub-attr-r input[type=\"radio\"]:checked + label:after {\n        transform: scale(1);\n    }\n    .nbo-sub-attr-r label {\n        background: unset !important;\n        color: unset !important;\n    }\n    .nbd-radio label,\n    .nbo-sub-attr-r label {\n        display: inline-block;\n        height: 20px;\n        position: relative;\n        padding: 0 30px;\n        margin-bottom: 0;\n        cursor: pointer;\n        line-height: 20px;\n    }\n    .nbd-radio label:before, .nbd-radio label:after,\n    .nbo-sub-attr-r label:before, .nbo-sub-attr-r label:after {\n        position: absolute;\n        content: '';\n        border-radius: 50%;\n        transition: all .3s ease;\n        transition-property: transform, border-color;\n        box-sizing: border-box;\n    }\n    .nbd-radio label:before,\n    .nbo-sub-attr-r label:before {\n        left: 0;\n        top: 0;\n        width: 20px;\n        height: 20px;\n        border: 2px solid rgba(0, 0, 0, 0.54);\n    }\n    .nbd-radio label:after,\n    .nbo-sub-attr-r label:after {\n        top: 5px;\n        left: 5px;\n        width: 10px;\n        height: 10px;\n        transform: scale(0);\n        background: #404762;\n    }    \n    .nbo-sub-attr-l label:after, .nbo-sub-attr-l label:before {\n        display: none;\n    }\n    \/* end. nbd-radio *\/\n    [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n      display: none !important;\n    }\n    .nbd-option-wrapper {\n        margin-bottom: 1.1em;\n    }\n    .nbd-option-field {\n        background-color: #fff;\n        margin-bottom: 1.1em;\n        border: 1px solid #f8f8f8;\n    }\n    .nbd-option-field select,\n    .nbd-option-field input[type=\"text\"]{\n        min-width: 150px;\n    }\n    td .nbo-dimension-label{\n        min-width: 50px;\n        display: inline-block;\n    }\n    .nbd-field-header {\n        padding: 10px;\n        background: #f8f8f8;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-field-header label {\n        font-weight: bold;\n    }\n    .nbd-field-content {\n        padding: 10px;\n    }    \n    .nbd-field-content:after,\n    .nbd-field-header:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbd-option-wrapper label {\n        cursor: pointer;\n        margin: 0 !important;\n        margin: 0px 4px 2px!important;\n    }\n    .nbd-swatch {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        border-radius: 50%; \n        cursor: pointer;\n        border: 2px solid #ddd;\n        position: relative;\n    }\n    .nbo-checkbox {\n        width: 36px;\n        height: 36px;\n        display: inline-block;\n        cursor: pointer;\n        border: 2px solid #ddd;\n    }\n    .nbd-option-wrapper input[type=\"radio\"], .nbo-checkbox-wrap input[type=\"checkbox\"] {\n        display: none;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label,\n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label {\n        border: 2px solid #404762;\n        position: relative;\n        display: inline-block;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:before {\n        display: block;\n        top: 0;\n        left: 0;\n        border: 2px solid #fff;\n        position: absolute;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        content: '';\n        border-radius: 100%;\n        box-sizing: border-box;\n    }\n    .nbd-swatch-wrap input[type=\"radio\"]:checked + label:after, \n    .nbo-checkbox-wrap input[type=\"checkbox\"]:checked + label:after {\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 6px;\n        height: 10px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 2px 2px 0;\n        position: absolute;\n        top: 7px;\n        left: 12px;\n    }\n    .nbo-dropdown {\n        border: 1px solid #EEE;\n        height: 36px;\n        padding: 3px 36px 3px 8px;\n        background-color: transparent;\n        line-height: 100%;\n        outline: 0;\n        background-image: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/arrow.png);\n        background-position: right;\n        background-repeat: no-repeat;\n        position: relative;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n    }\n    .nbd-label, .nbo-sub-attr-l label{\n        border-radius: 36px;\n        height: 36px;\n        line-height: 36px;\n        padding: 0 20px;\n        background: #ddd;\n        text-transform: uppercase;\n        font-size: 13px;\n        display: inline-block;\n        margin: 0 5px 5px 0;\n        -webkit-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -moz-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        -ms-box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);\n        color: #757575;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        -ms-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #eee;\n        max-width: 100%;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n    }\n    .nbd-label-wrap input[type=\"radio\"]:checked + label,\n    .nbo-sub-attr-l input[type=\"radio\"]:checked + label {\n        background: #404762;\n        color: #fff;\n    }\n    .nbd-label:hover, .nbo-sub-attr-l label:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }    \n    .nbd-swatch-wrap .nbd-field-content{\n        font-size: 0;\n    }\n    .nbd-required {\n        color: red !important;\n    }\n    .nbd-field-input-wrap input[type=\"number\"] {\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        margin-left: 0;\n        flex: 1;\n    }\n    .nbd-field-content input[type=\"range\"] {\n        padding: 0;\n        -webkit-appearance: none;\n        background: transparent;\n        border: none;\n        box-shadow: none;\n    }\n    .nbd-field-content input[type=\"range\"][name=\"nbo-quantity\"]{\n        max-width: 200px;\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-thumb {\n        -webkit-appearance: none;\n        height: 24px;\n        width: 24px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: -10px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-thumb {\n        height: 18px;\n        width: 18px;\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-thumb {\n        border-radius: 50%;\n        cursor: pointer;\n        background: #404762;\n        border: 4px solid transparent;\n        background-clip: padding-box;\n        box-sizing: border-box;\n        margin-top: 0;\n        height: 14px;\n        width: 14px;\n        border: 2px solid transparent\n    }\n    .nbd-field-content input[type=\"range\"]:focus {\n        outline: none\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-webkit-slider-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-moz-range-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]:focus::-ms-thumb {\n        background-color: #fff;\n        color: #191e23;\n        box-shadow: inset 0 0 0 1px #6c7781,inset 0 0 0 2px #fff;\n        outline: 2px solid transparent;\n        outline-offset: -2px\n    }\n    .nbd-field-content input[type=\"range\"]::-webkit-slider-runnable-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px;\n        margin-top: -4px\n    }\n    .nbd-field-content input[type=\"range\"]::-moz-range-track {\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content input[type=\"range\"]::-ms-track {\n        margin-top: -4px;\n        background: transparent;\n        border-color: transparent;\n        color: transparent;\n        height: 3px;\n        cursor: pointer;\n        background: #e2e4e7;\n        border-radius: 1.5px\n    }\n    .nbd-field-content .nbd-invalid-notice {\n        display: none;\n        font-size: 0.75em;\n        color: red;\n    }\n    .nbd-field-content input.ng-invalid-min ~ .nbd-invalid-min {\n        display: inline-block;\n    }\n    .nbd-field-content input.ng-invalid-max ~ .nbd-invalid-max {\n        display: inline-block;\n    } \n    .nbd-invalid-form {\n        color: red;\n    }\n    .nbo-disabled {\n        opacity: .5!important;\n        cursor: not-allowed;\n    }\n    .nbo-hidden {\n        display: none;\n    }\n    .nbo-table-wrap {\n        margin: 0 0 1.41575em;\n    }\n    .nbo-price-matrix, .nbo-table-wrap {\n        max-width: 100%;\n        overflow-x: scroll;\n        overflow: auto;\n    }\n    .nbo-table-wrap table {\n        margin: 0 !important;\n    }\n    .nbo-table-wrap table input[type=\"number\"]{\n        width: 4em;\n        padding: 0.418047em;\n        background-color: #f2f2f2;\n        color: #43454b;\n        outline: 0;\n        border: 0;\n        -webkit-appearance: none;\n        box-sizing: border-box;\n        font-weight: 400;\n        box-shadow: inset 0 1px 1px rgba(0,0,0,.125);\n        width: 4.235801032em;\n        text-align: center;\n    }    \n    .nbo-price-matrix table, .nbo-table-wrap table{\n        border-collapse: collapse;\n    }\n    .nbo-price-matrix table, .nbo-price-matrix td, .nbo-price-matrix th,\n    .nbo-table-wrap table, .nbo-table-wrap td, .nbo-table-wrap th {\n        text-align: center;\n        border: 1px solid #ddd;\n        vertical-align: middle;\n        padding: 0.75em 0.75em;\n    }\n    .nbd-product-tab .nbo-price-matrix td, .nbd-product-tab .nbo-price-matrix th {\n        text-align: center !important;\n        white-space: nowrap;\n    }\n    .nbo-price-matrix td, .nbo-table-wrap td {\n        cursor: pointer;\n    }\n    .nbo-pm-empty, .nbo-price-matrix th {\n        pointer-events: none;\n    }\n    .nbo-price-matrix td.selected {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-price-matrix td.disabled {\n        background-color: #f8f8f8;\n        pointer-events: none;\n    }\n    .nbo-dimension {\n        width: 4em;\n        background: #fff !important;\n        box-shadow: none !important;\n        height: 36px !important;\n    }\n    input.nbo-dimension::-webkit-outer-spin-button,\n    input.nbo-dimension::-webkit-inner-spin-button {\n        -webkit-appearance: none;\n        margin: 0;\n    }\n    input.nbo-dimension {\n        -moz-appearance:textfield;\n    }\n    .nbo-dimension-wrap {\n        border: solid 1px #eee;\n        -webkit-border-radius: 3px;\n        -moz-border-radius: 3px;\n        border-radius: 3px;\n        display: inline-block;\n    }\n    .nbo-updown-dimension {\n        display: inline-block;\n        width: 36px;\n        height: 36px;\n        vertical-align: top;\n        line-height: 36px;\n        text-align: center;\n        background: #eee;\n        font-size: 24px !important;\n        cursor: pointer;\n    }\n    .nbd-input-range {\n        margin-left: 5px;\n        background: #404762;\n        padding: 0 15px;\n        line-height: 20px;\n        vertical-align: middle;\n        color: #fff;\n        border-radius: 20px;\n        display: inline-block;\n    }    \n    .nbo-final-price {\n        background: #eee;\n        color: #404762;\n        font-weight: bold;\n    }\n    .nbd-swatch-label-wrap {\n        display: flex;\n        align-items: center;\n    }\n    .nbd-swatch-label-wrap:not(:last-child){\n        margin-bottom: 10px;  \n    }\n    .nbd-swatch-description {\n        font-size: 14px;\n        margin-left: 10px;\n    }\n    .nbo-clear-option-wrap {\n        text-align: right;\n        margin-bottom: 1em;\n        overflow: hidden;\n    }\n    .nbo-clear-option-wrap:after{\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-clear-option-wrap .nbd-button {\n        float: right !important;\n    }\n    .nbo-style-1 {\n        border: 1px solid #f8f8f8;\n        margin-bottom: 1em;\n    }\n    .nbo-style-1 .nbo-summary-title,\n    .nbo-style-1 .nbo-table-pricing-title{\n        padding: 10px;\n        background: #f8f8f8;\n        margin: 0;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-style-1 .nbo-summary-title:after {\n        clear: both;\n    }\n    .nbo-style-1 .nbo-summary-table ,\n    .nbo-style-1 .nbo-table-pricing {\n        margin: 0;\n        width: 100%;\n    }\n    .nbo-toggle {\n        text-align: center;\n        cursor: pointer;\n    }\n    .nbo-toggle svg {\n        vertical-align: top;\n        height: 100%;\n    }\n    .nbd-swatch-tooltip, \n    .nbo-group-timeline-tooltip {\n        background: #404762;\n        color: #fff !important;\n        border-radius: 4px;\n        font-size: 14px;\n        font-weight: bold;\n        position:  absolute;\n        bottom: 50%;\n        left: 50%;\n        pointer-events: none;\n        padding: 5px 7px;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transform: translate3d(-50%,0%,0);\n        -moz-transform: translate3d(-50%,0%,0);\n        transform: translate3d(-50%,0%,0);\n\/*         width: -webkit-max-content;\n        width: -moz-max-content;\n        width: max-content; *\/\n        display: inline-block;\n        white-space: nowrap;\n        max-width: 200px;\n        z-index: 99;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s; \n    }\n    .nbd-swatch-tooltip:before, \n    .nbo-group-timeline-tooltip:before {\n        content: '';\n        border-left: 5px solid transparent;\n        border-right: 5px solid transparent;\n        border-top: 5px solid #404762;\n        position: absolute;\n        bottom: -5px;\n        margin-left: -3px;\n        left: 50%;\n    }\n    .nbd-swatch:hover .nbd-swatch-tooltip {\n        bottom: 40px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-group-timeline-step:hover .nbo-group-timeline-tooltip {\n        bottom: 16px;\n        visibility: visible;\n        opacity: 1; \n    }\n    .nbo-wrapper:afte {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-bold {\n        font-weight: bold;\n    }\n    .nbo-sub-attr-wrap {\n        padding: 10px;\n        border: 1px solid #f8f8f8;\n        margin-top: 5px;\n    }\n    .nbd-input-u {\n        cursor: pointer;\n        padding: 30px;\n        width: 100%;\n        border: 2px dashed #ddd;\n        border-radius: 4px;\n    }\n    .nbd-field-textarea {\n        border: 1px solid #ddd;\n        width: 100%;\n    }\n    @media (min-width: 769px){\n        .nbd-tb-options td:first-child {\n            width: 30%;\n        }\n    }\n    .nbo-group-wrap {\n        margin-bottom: 15px;\n    }\n    .nbo-group-header {\n        border-bottom: 3px solid #f8f8f8;\n        height: 40px;\n        overflow: hidden;\n    }\n    .nbo-group-header .group-title {\n        background: #f8f8f8;\n        color: #404762;\n        display: inline-block;\n        position: relative;\n        padding: 0 15px;\n        height: 40px;\n        line-height: 40px;\n        box-sizing: border-box;\n        border-top-left-radius: 4px;\n        font-weight: bold;\n        max-width: calc(100% - 50px);\n    }\n    .nbo-group-header .group-title:after {\n        position: absolute;\n        right: -40px;\n        top: 0;\n        display: block;\n        content: '';\n        width: 0;\n        height: 0;\n        border-color: transparent;\n        border-width: 0;\n        border-top: 40px solid transparent;\n        border-left: 40px solid #f8f8f8;\n    }\n    .nbo-group-header .group-title .nbo-group-icon {\n        width: 30px;\n        height: 30px;\n        vertical-align: middle;\n        \/* border: 2px solid #fff; *\/\n        box-sizing: border-box;\n        border-radius: 50%;\n        display: inline-block;\n        margin: 0 10px 0 -5px;\n    }\n    .nbo-group-header .group-title .nbo-group-icon span {\n        width: 100%;\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        text-align: center;\n    }\n    .nbo-group-header .group-title .nbo-group-icon img {\n        max-width: 100%;\n        max-height: 100%;\n        display: inline-block;\n    }\n    .nbo-group-header .group-title .nbd-help-tip {\n        position: absolute;\n        top: 18px;\n    }\n    .nbo-group-footer {\n        background: #f8f8f8;\n        padding: 10px;\n        border-bottom-right-radius: 4px;\n        border-bottom-left-radius: 4px;\n    }\n    .nbo-group-wrap .nbo-group-body {\n        display: flex;\n         -webkit-align-items: flex-end; \n        -ms-flex-align: end;\n         align-items: flex-start; \n         display: -webkit-flex; \n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n         flex-wrap: wrap; \n        padding: 10px 5px;\n        border: 1px solid #f8f8f8;\n        position: relative;\n        background-color: #fff;\n    }\n    .nbo-clearfix:after {\n        content: '';\n        display: block;\n        clear: both;\n    }\n    .nbo-group-wrap .nbo-group-body .nbd-option-field {\n        width: calc(100% - 10px);\n        margin: 0 5px 10px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(50% - 10px);\n    }\n    .nbo-flex-col-2 .nbo-group-body .nbd-option-field:last-of-type:nth-child(2n+1) {\n        flex-basis: calc(100% - 10px);\n    }\n    .nbo-flex-col-3 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(33.3333% - 10px);\n    }\n    .nbo-flex-col-4 .nbo-group-body .nbd-option-field {\n        flex-basis: calc(25% - 10px);\n    }\n    .nbo-group-toggle {\n        position: absolute;\n        right: 10px;\n        bottom: -14px;\n        box-sizing: border-box;\n        width: 28px;\n        height: 28px;\n        border: 2px solid #f8f8f8;\n        border-radius: 50%;\n        background: #fff;\n        cursor: pointer;\n        text-align: center;\n        line-height: 24px;\n    }\n    .nbo-group-toggle svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        transform: rotate(-180deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbo-group-toggle svg{\n        transform: rotate(0deg);\n    }\n    .nbo-group-wrap .nbo-group-body.nbo-collapse .nbd-option-field {\n        display: none;\n    }\n    .nbo-group-toggle svg path{\n        fill: #ddd;\n    }\n    .nbd-option-field .nbd-field-header .nbo-toggle {\n        float: right;\n    }\n    .nbd-option-field .nbd-field-header .nbo-plus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-minus {\n        display: none;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-header .nbo-plus {\n        display: unset;\n    }\n    .nbd-option-field .nbd-field-content {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-option-field.nbo-collapse .nbd-field-content {\n        height: 0;\n        padding-top: 0;\n        padding-bottom: 0;\n        overflow: hidden;\n        opacity: 0;\n    }\n    .nbd-product-tab .nbo-group-wrap .nbo-group-body .nbd-option-field {\n         flex-basis: calc(100% - 10px) !important;\n    }\n    .nbd-field-ad-dropdown-wrap .nbd-field-content {\n        position: relative;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-dropdown {\n        display: none;\n    }\n    .nbo-ad-result {\n        height: 36px;\n        padding: 3px 8px;\n        border: 1px solid #EEE;\n        cursor: pointer;\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-ad-result-name{\n        flex-basis: calc(100% - 30px);\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n        line-height: 30px;\n    }\n    .nbd-field-ad-dropdown-wrap .nbo-ad-result svg{\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-result svg{\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-list {\n        position: absolute;\n        width: calc(100% - 20px);\n        top: 46px;\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        background: #fff;\n        z-index: 99;\n        cursor: pointer;\n        display: none;\n        opacity: 0;\n    }\n    .nbd-field-ad-dropdown-wrap.active .nbo-ad-pseudo-list{\n        display: block;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item {\n        display: flex;\n        position: relative;\n        padding: 5px 10px;\n        justify-content: space-between;\n        align-items: center;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:not(:last-child) {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #f8f8f8;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #0c8ea7;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-ad-item-main{\n        color: #fff;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-thumb{ \n        width: 50px;\n        height: 50px;\n        border-radius: 50%;\n        background: #fff;\n        margin-right: 10px;\n        box-sizing: border-box;\n        object-fit: cover;\n        flex: 0 0 50px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main {\n        display: flex;\n        justify-content: center;\n        flex-direction: column;\n        width: calc(100% - 60px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-main.nbo-shrink {\n        width: calc(100% - 84px);\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-item-title {\n        font-weight: bold;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand{\n        position: absolute;\n        top: -3px;\n        right: 17px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-recomand svg path {\n        fill: #db133b;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item.active > .nbo-recomand svg path {\n        fill: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list {\n        padding: 5px;\n    }\n    .nbd-field-ad-dropdown-wrap.nbd-field-shape.active .nbo-ad-pseudo-list {\n        display: flex !important;\n        flex-wrap: wrap;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item {\n        width: 50px;\n        height: 50px;\n        padding: 0;\n        margin: 5px;\n        align-items: center;\n        text-align: center;\n        border-bottom: none;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover {\n        background: #fff;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active {\n        background: #f8f8f8;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name{\n        width: 30px;\n        height: 30px;\n        align-items: center;\n        text-align: center;\n        display: flex !important;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg{\n        height: 30px;\n        width: 30px;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-shape svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-result .nbo-ad-result-name {\n        flex-basis: calc(100% - 60px);\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg{\n        height: 50px;\n        width: 50px;\n        display: block;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item svg path{\n        fill: #ddd;\n        stroke-width: 1;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item:hover svg path{\n        fill: #404762;\n        stroke: #404762;\n    }\n    .nbd-field-shape .nbo-ad-pseudo-list .nbo-ad-list-item.active svg path{\n        fill: #404762 !important;\n        stroke: #404762;\n    }\n    .nbo-rotate-180 {\n        transform: rotate(180deg);\n    }\n    .nbo-ad-pseudo-sublist {\n        position: absolute;\n        top: calc(100% + 40px);\n        left: 5px;\n        width: 100%;\n        visibility: hidden;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        background: #fff;\n        -webkit-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -moz-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        -ms-box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        box-shadow: 0 0 40px 0 rgba(0,0,0,0.2);\n        z-index: 100;\n    }\n    .nbo-ad-pseudo-sublist-toggle {\n        height: 24px;\n        width: 24px;\n        background: #fff;\n        border-radius: 50%;\n        flex: 0 0 24px;\n    }\n    .nbo-ad-pseudo-list .nbo-ad-list-item .nbo-ad-pseudo-sublist.active {\n        top: calc(100% - 5px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist {\n        left: calc(100%);\n        top: 0;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-list-item:hover .nbo-ad-pseudo-sublist {\n        left: calc(100% - 34px);\n        visibility: visible;\n        opacity: 1;\n    }\n    .nbo-ad-pseudo-list.nbo-ad-right .nbo-ad-pseudo-sublist-toggle {\n        transform: rotate(-90deg);\n        background: transparent;\n        pointer-events: none;\n    }\n    .nbo-ad-item-description {\n        font-size: 0.75em;\n    }\n    .nbd-xlabel-wrapper {\n        justify-content: flex-start;\n        align-items: flex-start;\n        -webkit-align-items: flex-start;\n        -ms-flex-align: end;\n        align-items: flex-start;\n        display: flex; \n        display: -webkit-flex;\n        display: -ms-flexbox;\n        -webkit-flex-wrap: wrap;\n        -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    }\n    .nbd-xlabel-wrap {\n        width: calc(25% - 10px);\n        display: inline-block;\n        margin: 0 10px 10px 0;\n        box-sizing: border-box;\n        vertical-align: top;\n        text-align: center;\n    }\n    .nbd-product-tab .nbd-xlabel-wrap {\n        width: calc(50% - 10px);\n    }\n    .nbd-xlabel-value {\n        width: 100%;\n        padding-top: 100%;\n        position: relative;\n    }\n    .nbd-xlabel-value-inner {\n        top: 0;\n        left: 0;\n        bottom: 0;\n        right: 0;\n        position: absolute;\n    }\n    .nbd-xlabel {\n        display: block;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        border: 2px solid #fff;\n        border-radius: 10px;\n        position: relative;\n        text-align: left;\n        box-shadow: 1px 0 10px rgba(0,0,0,.08);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbd-xlabel:hover {\n        -webkit-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -moz-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        -ms-box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n        box-shadow: 0 3px 10px 0 rgba(75,79,84,.3);\n    }\n    .nbd-xlabel .nbo-recomand {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n    }\n    .nbd-xlabel .nbo-recomand svg path {\n        fill: #0c8ea7;\n    }\n    .nbd-xlabel .nbo-recomand svg {\n        width: 20px;\n        height: 32px;\n    }\n    .nbd-xlabel .nbd-help-tip {\n        width: 24px;\n        height: 24px;\n        font-size: 16px;\n        background: #404762;\n        top: 4px;\n    }\n    input[type=radio]+label.nbd-xlabel {\n        margin: 0 !important;\n    }\n    .nbd-xlabel-wrap input:checked + label {\n    }\n     .nbd-xlabel-wrap input:checked + label:after{\n        -webkit-transform: rotate(45deg);\n        -moz-transform: rotate(45deg);\n        transform: rotate(45deg);\n        content: \"\";\n        width: 20px;\n        height: 40px;\n        display: block;\n        border: solid #404762;\n        border-width: 0 4px 4px 0;\n        position: absolute;\n        top: calc(50% - 22px);\n        left: calc(50% - 12px);\n        transform-origin: center center;\n        -webkit-filter: drop-shadow(5px 5px 15px #404762);\n        filter: drop-shadow(5px 5px 15px #404762);\n    }\n    .nbd-xlabel-wrap > label {\n        width: 100%;\n        word-wrap: break-word;\n    }\n    .nbd-xlabel .nbd-help-tip:after {\n        margin-top: 3px;\n    }\n    .nbo-gallery-loading {\n        position: relative;\n    }\n    .nbo-gallery-loading:after{\n        position: absolute;\n        display: block;\n        content: '';\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 2;\n        pointer-events: none;\n        text-align: center;\n        background: url('https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/preloader-gif.svg') 50% 50%;\n        background-repeat: no-repeat;\n    }\n    .nbo-dec {\n        color: #04b591;\n    }\n    .nbo-inc {\n        color: #db133b;\n    }\n    .nbo-group-type2-wrap .group-type2-title {\n        width: 100%;\n        display: flex;\n        justify-content: space-between;\n        border-top: 1px solid #ddd;\n        padding-top: 5px;\n        padding-bottom: 5px;\n        color: #04b591;\n        font-weight: bold;\n    }\n    .nbo-group-type2-toggle {\n        cursor: pointer;\n        transform: rotate(180deg);\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n        margin-right: 10px;\n    }\n    .nbo-group-type2-toggle svg {\n        vertical-align: top;\n    }\n    .nbo-group-type2-toggle svg path{\n        fill: #04b591;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n        float: left;\n        width: 100%;\n        border: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-body {\n        display: none;\n    }\n    .nbo-group-type2-wrap.nbo-collapse .nbo-group-type2-toggle {\n        transform: rotate(0deg);\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body:after,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-2 .nbo-group-type2-body .nbd-option-field {\n        width: 50%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-3 .nbo-group-type2-body .nbd-option-field {\n        width: 33.3333%;\n    }\n    .nbo-group-type2-wrap.nbo-float-col-4 .nbo-group-type2-body .nbd-option-field {\n        width: 25%;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header,\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        float: left;\n        background: transparent;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-header {\n        width: 33.3333%;\n        margin-top: 5px;\n    }\n    .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field .nbd-field-content {\n        width: 66.6666%;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary{\n        position: fixed;\n        bottom: 0;\n        left: 0px;\n        z-index: 999999998;\n        background: #fff;\n        width: 300px;\n        font-size: 0.8em;\n        box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);\n        max-height: calc(100vh - 50px);\n        overflow: hidden;\n        overflow-y: auto;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-title {\n        margin: 0;\n        padding: 10px 15px;\n        background: #0c8ea7;\n        color: #fff;\n        border-top-right-radius: 4px;\n    }\n    .nbo-table-summary-wrap.nbo-float-summary .nbo-summary-table {\n        margin-bottom: 0;\n    }\n    .nbo-float-summary .nbo-summary-title .nbo-toggle {\n        display: none;\n    }\n    .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th {\n        padding: 0;\n        text-align: center;\n        background: transparent;\n        vertical-align: middle;\n        border-top: 1px solid #ddd;\n        border-left: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table td:last-child, .nbo-delivery-wrapper table th:last-child {\n        border-right: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table tr:last-child td {\n        border-bottom: 1px solid #ddd;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-date-wrap-title {\n        background: #ddd;\n    }\n    .nbo-delivery-wrapper table td {\n        height: 50px;\n    }\n    .nbo-delivery-wrapper table .nbo-delivery-icon-wrap {\n        width: 120px;\n        border-top: 1px solid transparent;\n        border-left: none;\n    }\n    .nbo-delivery-icon {\n        display: flex;\n        height: 90px;\n        flex-direction: column;\n        background: #fff;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-icon svg {\n        width: 40px; \n        height: 40px; \n    }\n    .nbo-delivery-icon svg path{\n        fill: #0c8ea7;\n    }\n    .nbo-delivery-qty {\n        background: #ddd;\n        height: 30px;\n        line-height: 30px;\n    }\n    .nbo-delivery-date-wrap {\n        height: 100%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n    }\n    .nbo-delivery-date-title {\n        font-size: 0.8em;\n        margin-bottom: 1em;\n    }\n    .nbo-delivery-date {\n        font-size: 0.8em;\n        font-weight: normal;\n    }\n    .nbo-delivery-date2 {\n        color: #db133b;\n        line-height: 1.5em;\n    }\n    .nbo-delivery-date2 .day {\n        font-size: 1.5em;\n    }\n    .nbo-delivery-date-selector {\n        cursor: pointer;\n        -webkit-transition: all 0.2s;\n        -moz-transition: all 0.2s;\n        transition: all 0.2s;\n    }\n    .nbo-delivery-date-selector.active,\n    .nbo-delivery-date-selector:hover {\n        background: #404762 !important;\n        color: #fff !important;\n    }\n    .nbo-delivery-date-selector > span {\n        display: block;\n    }\n    .nbo-delivery-date-selector span.nbo-delivery-price-item{\n        display: block;\n        font-size: 0.7em;\n        color: #888;\n    }\n    .nbo-delivery-date-selector.active span.nbo-delivery-price-item,\n    .nbo-delivery-date-selector:hover span.nbo-delivery-price-item{\n        color: #fff;\n    }\n    .nbo-float-summary-toggle {\n        height: 16px;\n        width: 16px;\n        cursor: pointer;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-float-summary-toggle svg{ \n        height: 100%;\n    }\n    .nbo-float-summary-toggle svg path{ \n        fill: #fff;\n    }\n    .nbo-float-summary .nbo-summary-title {\n        display: flex;\n        justify-content: space-between;\n    }\n    .nbo-float-summary.nbo-collapse .nbo-float-summary-toggle {\n        transform: rotate(180deg);\n    }\n    .nbo-float-summary.nbo-collapse .nbo-summary-table {\n        display: none;\n    }\n    .nbdd_disable {\n        pointer-events: none;\n    }\n    .nbo-delivery-custom-quantity input{\n        height: 34px;\n        line-height: 34px;\n        padding: 0 0 0 10px;\n        vertical-align: top;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity{\n        height: 34px;\n        line-height: 34px;\n    }\n    .nbo-delivery-custom-quantity .update-custom-quantity path{\n        fill: #fff;\n    }\n    input.ng-invalid, select.ng-invalid{\n        border: 1px solid red !important;\n    }\n    .nbo-detail-popup-wrap {\n        position: fixed;\n        top: 0;\n        left: 0;\n        height: 9999px; \n        width: 100vw;\n        z-index: -1;\n        opacity: 0;\n        -webkit-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-detail-popup-wrap.nb-show {\n        z-index: 999999;\n        opacity: 1;\n    }\n    .nbo-detail-popup-wrap .popup-inner {\n        position: absolute;\n        width: 100%;\n        height: 100vh;\n        overflow: auto;\n        padding: 60px 0;\n        box-sizing: border-box;\n        background: rgba(0,0,0,0.7);\n        text-align: center;\n    }\n    .nbo-detail-popup-wrap .main-popup {\n        width: 800px;\n        padding: 0 20px 20px;\n        background-color: #fff;\n        border-radius: 2px;\n        box-sizing: border-box;\n        -webkit-transition: all .4s;\n        -moz-transition: all .4s;\n        transition: all .4s;\n        display: inline-block;\n        text-align: left;\n    }\n    .nbo-detail-popup-wrap .main-popup .nbo-detail-popup-header {\n        height: 60px;\n        line-height: 60px;\n        font-weight: bold;\n    }\n    .nbo-clearfix:after {\n        display: block;\n        content: '';\n        clear: both;\n    }\n    .nbo_map_disable {\n        pointer-events: none;\n        opacity: 0.7;\n    }\n    .nbo-hidden-checked:before {\n        border-color: rgba(0, 0, 0, 0.54) !important;\n    }\n    .nbo-hidden-checked:after {\n        transform: scale(0) !important;\n    }\n    .nbo-invalid-option {\n        color: red;\n        font-size: 0.8em;\n        font-style: italic;\n        opacity: 0;\n    }\n    .nbo-invalid-option.active {\n        opacity: 1;\n    }\n    .nbo-disabled-wrap {\n        opacity: 0.7;\n        pointer-events: none;\n    }\n    .nbo_group_panel_wrap {\n        overflow: hidden;\n    }\n    .nbo_group_panel_wrap_inner {\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo_group_panel_wrap_inner .nbo-group-wrap,\n    .nbo_group_panel_wrap_inner .nbo-group-type2-wrap{\n        float: left;\n        position: relative;\n    }\n    .nbo_group_panel_prev, .nbo_group_panel_next {\n        display: inline-block;\n        border: 1px solid #eeeeee;\n        box-sizing: border-box;\n        height: 30px;\n        margin-right: 5px;\n        padding: 0 5px;\n        cursor: pointer;\n        background: #eeeeee;\n    }\n    .nbo_group_panel_prev svg,\n    .nbo_group_panel_prev span,\n    .nbo_group_panel_next svg,\n    .nbo_group_panel_next span{\n        display: inline-block;\n        vertical-align: middle;\n        font-size: 14px;\n        line-height: 27px;\n    }\n    .nbo_group_panel_prev svg path, .nbo_group_panel_next  svg path{\n        fill: #6d6d6d;\n    }\n    .nbo_group_panel_prev svg {\n        transform: rotate(90deg);\n    }\n    .nbo_group_panel_next svg {\n        transform: rotate(-90deg);\n    }\n    .nbo-group-timeline-container {\n        position: relative;\n        height: 100px;\n    }\n    .nbd-product-tab .nbo-group-timeline-container{\n        display: none;\n    }\n    .nbo-group-timeline-wrap {\n        position: relative;\n        height: 100%;\n        overflow: hidden;\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-wrap {\n        margin: 0 40px;\n    }\n    .nbo-group-timeline-paged {\n        position: absolute;\n        z-index: 1;\n        top: 50%;\n        -webkit-transform: translateY(-50%);\n        -ms-transform: translateY(-50%);\n        transform: translateY(-50%);\n        height: 34px;\n        width: 34px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        display: none;\n        cursor: pointer;\n        text-align: center;\n        padding-top: 3px;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-paged svg path{\n        fill: #dfdfdf;\n    }\n    .nbo-group-timeline-paged:hover {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-paged:hover svg path{\n        fill: #404762;\n    }\n    .nbo-group-timeline-paged-prev {\n        left: 0;\n        -webkit-transform: translateY(-50%) rotate(90deg);\n        -ms-transform: translateY(-50%) rotate(90deg);\n        transform: translateY(-50%) rotate(90deg);\n    }\n    .nbo-group-timeline-paged-next {\n        right: 0;\n        -webkit-transform: translateY(-50%) rotate(-90deg);\n        -ms-transform: translateY(-50%) rotate(-90deg);\n        transform: translateY(-50%) rotate(-90deg);\n    }\n    .nbo-group-timeline-container.paged .nbo-group-timeline-paged{\n        display: block;\n    }\n    .nbo-group-timeline-wrap:before,\n    .nbo-group-timeline-wrap:after {\n        content: '';\n        position: absolute;\n        z-index: 2;\n        top: 41px;\n        height: 16px;\n        width: 20px;\n    }\n    .nbo-group-timeline-wrap:before {\n        left: 0;\n        background: linear-gradient(to right,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-wrap:after {\n        right: 0;\n        background: linear-gradient(to left,#ffffff,rgba(247, 247, 247, 0));\n    }\n    .nbo-group-timeline-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 49px;\n        height: 2px;\n        background-color: #dfdfdf;\n        -webkit-transition: all 0.4s;\n        -moz-transition: all 0.4s;\n        transition: all 0.4s;\n    }\n    .nbo-group-timeline-step {\n        position: absolute;\n        width: 0;\n        height: 0;\n        z-index: 3;\n    }\n    .nbo-group-timeline-step-inner {\n        position: relative;\n        width: 0;\n        height: 0;\n    }\n    .nbo-group-timeline-step-inner:after {\n        content: '';\n        position: absolute;\n        right: -9px;\n        bottom: -8px;\n        height: 12px;\n        width: 12px;\n        border-radius: 50%;\n        border-width: 2px;\n        border-style: solid;\n        border-color: #dfdfdf;\n        background-color: #fff;\n        cursor: pointer;\n        z-index: 1;\n    }\n    .nbo-group-timeline-step.active .nbo-group-timeline-step-inner:after {\n        background-color: #404762;\n        border-color: #404762;\n    }\n    .nbo-group-timeline-step.over .nbo-group-timeline-step-inner:after {\n        border-color: #404762;\n    }\n    .nbo-group-timeline-fill-line {\n        position: absolute;\n        z-index: 1;\n        left: 0;\n        top: 0;\n        height: 100%;\n        width: 100%;\n        background-color: #404762;\n        transform-origin: left center;\n        -webkit-transition: all 0.3s;\n        -moz-transition: all 0.3s;\n        transition: all 0.3s;\n    }\n    .drt-up .nbo-ad-pseudo-list {\n        bottom: 46px;\n        top: unset !important;\n    }\n    @media (max-width:768px){\n        .nbo-detail-popup-wrap .main-popup {\n            width: calc(100% - 30px);;\n        }\n        .nbo-group-type2-wrap .nbo-group-type2-body .nbd-option-field {\n            width: 100% !important;\n        }\n        .nbo-group-wrap .nbo-group-body .nbd-option-field {\n            flex-basis: calc(100% - 10px);\n        }\n        .nbd-swatch-tooltip {\n            display: none;\n        }\n        .nbd-tb-options td {\n            display: inline-block !important;\n            width: 100%;\n            padding: 10px !important;\n        }\n        .nbo-summary-wrapper table tfoot td:last-child,\n        .nbo-summary-wrapper table th {\n            white-space: nowrap;\n        }\n        .nbo-table-pricing-wrap {\n            overflow-x: scroll;\n        }\n        .nbo-table-summary-wrap, .nbo-table-pricing-wrap {\n            background: #f8f8f8;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th{\n            white-space: nowrap;\n        }\n        .nbo-delivery-wrapper table td, .nbo-delivery-wrapper table th:not(.nbo-delivery-icon-wrap){\n            padding: 0 10px !important;\n        }\n        .nbo-delivery-icon {\n            width: 100px !important;\n        }\n        .nbo-delivery-wrapper {\n            overflow-x: scroll;\n        }\n    }\n<\/style>\n<div class=\"nbd-option-wrapper\"  id=\"nbo-app-1779018420653\">\n    <div ng-controller=\"optionCtrl\" ng-form=\"nboForm\" id=\"nbo-ctrl-nbo-app-1779018420653\" ng-cloak>\n        <div class=\"nbo-fields-wrapper\">\n                <div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594258039088\" ng-if=\"nbd_fields['f1594258039088'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594258039088'>\n        Would you like to print your books            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594258039088]{{nbd_fields['f1594258039088'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594258039088'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Yes, print my books<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594258039088'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594258039088', '0');updateMapOptions('f1594258039088')\"\n                     ng-class=\"nbd_fields['f1594258039088'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594258039088'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Yes, print my books<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594258039088'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594258039088'].valid === false\">{{nbd_fields['f1594258039088'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbo-group-wrap nbo-flex-col-3\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Page Count (A page is one side of a sheet. Please be accurate below)<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1593989394990\" ng-if=\"nbd_fields['f1593989394990'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1593989394990'>\n        Paper Type            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"0\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-0' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1593989394990-0' nbo-disabled=\"!status_fields['f1593989394990'][0].enable\" nbo-disabled-type=\"class\" >Standard Paper- 100gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"1\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-1' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-1' nbo-disabled=\"!status_fields['f1593989394990'][1].enable\" nbo-disabled-type=\"class\" >Economy Paper - 80gsm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1593989394990')\" value=\"2\" ng-model=\"nbd_fields['f1593989394990'].value\" id='nbd-field-f1593989394990-2' \n                   name=\"nbd-field[f1593989394990]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1593989394990-2' nbo-disabled=\"!status_fields['f1593989394990'][2].enable\" nbo-disabled-type=\"class\" >Premium Quality Paper - 160gsm <\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1593989394990'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1593989394990'].valid === false\">{{nbd_fields['f1593989394990'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003765618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003765618'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003765618'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003765618]\" id=\"nbd-field-f1594003765618\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594003984918'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594003984918'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594003984918'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594003984918]\" id=\"nbd-field-f1594003984918\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004768125'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004768125'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004768125'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004768125]\" id=\"nbd-field-f1594004768125\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004770828'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004770828'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004770828'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004770828]\" id=\"nbd-field-f1594004770828\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004830503'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004830503'>\n        Black & White Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004830503'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004830503]\" id=\"nbd-field-f1594004830503\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594004832682'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594004832682'>\n        Colour Page                <span class=\"nbd-required\">*<\/span>\n            <\/label> \n        <span data-position=\"top\" data-tip=\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\" class=\"nbd-help-tip\"><\/span>\n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594004832682'].value\" class=\"nbd-input-n\"\n            required name=\"nbd-field[f1594004832682]\" id=\"nbd-field-f1594004832682\"\n                        string-to-number type=\"number\" min=\"0\" max=\"1000\" step=\"1\" ng-step=\"1\"\n                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 0<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 1000<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005174967\" ng-if=\"nbd_fields['f1594005174967'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005174967'>\n        Single & Double Sided Printing            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"0\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-0' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-0' nbo-disabled=\"!status_fields['f1594005174967'][0].enable\" nbo-disabled-type=\"class\" >Single Sided<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005174967')\" value=\"1\" ng-model=\"nbd_fields['f1594005174967'].value\" id='nbd-field-f1594005174967-1' \n                   name=\"nbd-field[f1594005174967]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005174967-1' nbo-disabled=\"!status_fields['f1594005174967'][1].enable\" nbo-disabled-type=\"class\" >Double Sided<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005174967'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005174967'].valid === false\">{{nbd_fields['f1594005174967'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Binding Cover and Turnaround time <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005142537\" ng-if=\"nbd_fields['f1594005142537'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005142537'>\n        Binding Style            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"0\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-0' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594005142537-0' nbo-disabled=\"!status_fields['f1594005142537'][0].enable\" nbo-disabled-type=\"class\" >(Landscape) 11x14'' \/ 28x35cm<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005142537')\" value=\"1\" ng-model=\"nbd_fields['f1594005142537'].value\" id='nbd-field-f1594005142537-1' \n                   name=\"nbd-field[f1594005142537]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005142537-1' nbo-disabled=\"!status_fields['f1594005142537'][1].enable\" nbo-disabled-type=\"class\" >(Portrait) 14x11'' \/ 35x28cm<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005142537'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005142537'].valid === false\">{{nbd_fields['f1594005142537'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div nbo-adv-dropdown class=\"nbd-option-field nbd-field-ad-dropdown-wrap  \" data-id=\"f1594038618358\" ng-if=\"nbd_fields['f1594038618358'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594038618358'>\n        Upgrade turnaround time            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div>\n            <select ng-change=\"check_valid()\" name=\"nbd-field[f1594038618358]{{nbd_fields['f1594038618358'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594038618358'].value\">\n                            <option value=\"0\"\n                     selected='selected'>Not required, Standard 5 days<\/option>\n                            <option value=\"1\"\n                    >+90, Upgrade to 3 days<\/option>\n                            <option value=\"2\"\n                    >+120, Upgrade to 24 Hour<\/option>\n                        <\/select> \n            <div class=\"nbo-ad-result\">\n                <span class=\"nbo-ad-result-name\">{{nbd_fields['f1594038618358'].value_name}}<\/span>\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                    <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n                <\/svg>\n            <\/div>\n            <div class=\"nbo-ad-pseudo-list \">\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '0');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '0' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][0].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">Not required, Standard 5 days<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                        <span class=\"nbo-recomand\" title=\"Recommended\">\n                        <svg class=\"octicon octicon-bookmark\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M9 0H1C.27 0 0 .27 0 1v15l5-3.09L10 16V1c0-.73-.27-1-1-1zm-.78 4.25L6.36 5.61l.72 2.16c.06.22-.02.28-.2.17L5 6.6 3.12 7.94c-.19.11-.25.05-.2-.17l.72-2.16-1.86-1.36c-.17-.16-.14-.23.09-.23l2.3-.03.7-2.16h.25l.7 2.16 2.3.03c.23 0 .27.08.09.23h.01z\"><\/path><\/svg>\n                    <\/span>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '1');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '1' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][1].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+90, Upgrade to 3 days<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                                <div class=\"nbo-ad-list-item\" \n                     ng-click=\"select_adv_attr('f1594038618358', '2');updateMapOptions('f1594038618358')\"\n                     ng-class=\"nbd_fields['f1594038618358'].value == '2' ? 'active' : ''\"\n                     nbo-disabled=\"!status_fields['f1594038618358'][2].enable\" nbo-disabled-type=\"class\" >\n                                        <div class=\"nbo-ad-item-main \">\n                        <div class=\"nbo-ad-item-title\">+120, Upgrade to 24 Hour<\/div>\n                        <div class=\"nbo-ad-item-description\"><\/div>\n                    <\/div>\n                                                        <\/div>\n                            <\/div>\n            <div class=\"nbo-invalid-option\" \n                ng-class=\"nbd_fields['f1594038618358'].valid === false ? 'active' : ''\"\n                ng-if=\"nbd_fields['f1594038618358'].valid === false\">{{nbd_fields['f1594038618358'].invalidOption}} is not available            <\/div>\n        <\/div>\n    <\/div>\n<\/div><div class=\"nbd-option-field  \" data-id=\"f1594005480448\" ng-if=\"nbd_fields['f1594005480448'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005480448'>\n        Cover Colour            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-swatch-wrap\">\n                                    <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"0\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-0' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #000000\" \n                title=\"Buckram - Black\" for='nbd-field-f1594005480448-0'\n                nbo-disabled=\"!status_fields['f1594005480448'][0].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"1\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-1' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #1e73be\" \n                title=\"Buckram - Blue\" for='nbd-field-f1594005480448-1'\n                nbo-disabled=\"!status_fields['f1594005480448'][1].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Blue<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"2\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-2' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #dd3333\" \n                title=\"Buckram - Red\" for='nbd-field-f1594005480448-2'\n                nbo-disabled=\"!status_fields['f1594005480448'][2].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Red<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"3\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-3' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: #426018\" \n                title=\"Buckram - Green\" for='nbd-field-f1594005480448-3'\n                nbo-disabled=\"!status_fields['f1594005480448'][3].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Buckram - Green<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"4\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-4' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Black\" for='nbd-field-f1594005480448-4'\n                nbo-disabled=\"!status_fields['f1594005480448'][4].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Black<\/span>            <\/label>\n                                                <input ng-change=\"check_valid();updateMapOptions('f1594005480448')\" value=\"5\" ng-model=\"nbd_fields['f1594005480448'].value\" name=\"nbd-field[f1594005480448]\" \n                   type=\"radio\" id='nbd-field-f1594005480448-5' \n                 \/>\n            <label class=\"nbd-swatch\" style=\"background: url(https:\/\/mythesis.co.nz\/wp-content\/plugins\/web-to-print-online-designer\/assets\/images\/placeholder.png) 0% 0% \/ cover\" \n                title=\"Leatherette - Burgundy\" for='nbd-field-f1594005480448-5'\n                nbo-disabled=\"!status_fields['f1594005480448'][5].enable\" nbo-disabled-type=\"class\" >\n                <span class=\"nbd-swatch-tooltip\">Leatherette - Burgundy<\/span>            <\/label>\n                                <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005480448'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005480448'].valid === false\">{{nbd_fields['f1594005480448'].invalidOption}} is not available.        <\/div>\n            <\/div>\n<\/div>\n<div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594008130155\" ng-if=\"nbd_fields['f1594008130155'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008130155'>\n        Gold Lettering            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"0\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-0' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-0' nbo-disabled=\"!status_fields['f1594008130155'][0].enable\" nbo-disabled-type=\"class\" >Spine + Front Cover<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"1\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-1' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594008130155-1' nbo-disabled=\"!status_fields['f1594008130155'][1].enable\" nbo-disabled-type=\"class\" >Spine Only<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594008130155')\" value=\"2\" ng-model=\"nbd_fields['f1594008130155'].value\" id='nbd-field-f1594008130155-2' \n                   name=\"nbd-field[f1594008130155]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"attr\" \n                 checked='checked'\/> <label for='nbd-field-f1594008130155-2' nbo-disabled=\"!status_fields['f1594008130155'][2].enable\" nbo-disabled-type=\"class\" >No Gold Lettering<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594008130155'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594008130155'].valid === false\">{{nbd_fields['f1594008130155'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007067185'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007067185'>\n        Cover Title            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007067185'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007067185]\" id=\"nbd-field-f1594007067185\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Type your thesis title here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594007068623'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594007068623'>\n        Cover Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594007068623'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594007068623]\" id=\"nbd-field-f1594007068623\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type your thesis Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008400487'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008400487'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008400487'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008400487]\" id=\"nbd-field-f1594008400487\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"150\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008404745'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008404745'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008404745'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008404745]\" id=\"nbd-field-f1594008404745\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008883618'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008883618'>\n        Shortened title for Spine            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008883618'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008883618]\" id=\"nbd-field-f1594008883618\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine title here, maximum: 45-50 characters;\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594008880872'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594008880872'>\n        Spine Author            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594008880872'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594008880872]\" id=\"nbd-field-f1594008880872\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"100\"                                    placeholder=\"Type Spine Author here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-1\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Upload Thesis <\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-radio-wrap  \" data-id=\"f1594005757318\" ng-if=\"nbd_fields['f1594005757318'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005757318'>\n        How would you like to upload books?            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"nbd-radio __nbd-radio-wrap\">\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"0\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-0' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-0' nbo-disabled=\"!status_fields['f1594005757318'][0].enable\" nbo-disabled-type=\"class\" >Upload here<\/label>\n                        <input ng-change=\"check_valid();updateMapOptions('f1594005757318')\" value=\"1\" ng-model=\"nbd_fields['f1594005757318'].value\" id='nbd-field-f1594005757318-1' \n                   name=\"nbd-field[f1594005757318]\" type=\"radio\" \n                   nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"attr\" \n                \/> <label for='nbd-field-f1594005757318-1' nbo-disabled=\"!status_fields['f1594005757318'][1].enable\" nbo-disabled-type=\"class\" >Upload to Google drive and Dropbox<\/label>\n                    <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594005757318'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594005757318'].valid === false\">{{nbd_fields['f1594005757318'].invalidOption}} is not available        <\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005832365'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005832365'>\n        Upload Your books here            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594005832365'].value\" class=\"nbd-input-u\"\n             name=\"nbd-field[f1594005832365]\" id=\"nbd-field-f1594005832365\"\n                        type=\"file\" nbo-input-file=\"check_valid()\" data-field-id=\"f1594005832365\" data-types=\"pdf,zip,rar\" \n                data-minsize=\"0\" data-maxsize=\"100\"\n                                data-file=\"\" data-filename=\"\" data-uploaded=\"0\"\n                                accept=\".pdf,.zip,.rar\"\n                                    \/>\n                        <span style=\"display: block; font-size: 12px;margin-top: 10px;\">Min size: 0 MB<\/span>\n                        <span style=\"display: block; font-size: 12px;\">Max size: 100 MB<\/span>\n                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594005837304'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594005837304'>\n        Google drive and Dropbox Download Link            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <textarea name=\"nbd-field[f1594005837304]\" class=\"nbd-field-textarea\" rows=\"3\"\n            ng-model=\"nbd_fields['f1594005837304'].value\" ng-change=\"check_valid()\" \n             \n            pattern=\".{0}|.{0,}\" maxlength=\"200\" ><\/textarea>\n    <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n<div class=\"nbo-group-wrap nbo-flex-col-2\"  >\n    <div class=\"nbo-group-header\">\n        <span class=\"group-title\">\n                        <span>Extras<\/span>\n                    <\/span>\n    <\/div>\n    <div class=\"nbo-group-body\">\n        <div class=\"nbd-option-field nbd-field-dropdown-wrap  \" data-id=\"f1594009471824\" ng-if=\"nbd_fields['f1594009471824'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009471824'>\n        University            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <div class=\"__nbd-dropdown-wrap\">\n            <select ng-change=\"check_valid();updateMapOptions('f1594009471824')\" name=\"nbd-field[f1594009471824]{{nbd_fields['f1594009471824'].form_name}}\" class=\"nbo-dropdown\" ng-model=\"nbd_fields['f1594009471824'].value\">\n                            <option value=\"0\" nbo-disabled=\"!status_fields['f1594009471824'][0].enable\" nbo-disabled-type=\"attr\" \n                    >University of Auckland                <\/option>\n                            <option value=\"1\" nbo-disabled=\"!status_fields['f1594009471824'][1].enable\" nbo-disabled-type=\"attr\" \n                    >Victoria University of Wellington                <\/option>\n                            <option value=\"2\" nbo-disabled=\"!status_fields['f1594009471824'][2].enable\" nbo-disabled-type=\"attr\" \n                    >Massey University                <\/option>\n                            <option value=\"3\" nbo-disabled=\"!status_fields['f1594009471824'][3].enable\" nbo-disabled-type=\"attr\" \n                    >University of Waikato                <\/option>\n                            <option value=\"4\" nbo-disabled=\"!status_fields['f1594009471824'][4].enable\" nbo-disabled-type=\"attr\" \n                    >University of Otago                <\/option>\n                            <option value=\"5\" nbo-disabled=\"!status_fields['f1594009471824'][5].enable\" nbo-disabled-type=\"attr\" \n                    >Lincoln University                <\/option>\n                            <option value=\"6\" nbo-disabled=\"!status_fields['f1594009471824'][6].enable\" nbo-disabled-type=\"attr\" \n                    >University of Canterbury                <\/option>\n                            <option value=\"7\" nbo-disabled=\"!status_fields['f1594009471824'][7].enable\" nbo-disabled-type=\"attr\" \n                    >Not above                <\/option>\n                        <\/select> \n        <\/div>\n        <div class=\"nbo-invalid-option\" \n            ng-class=\"nbd_fields['f1594009471824'].valid === false ? 'active' : ''\"\n            ng-if=\"nbd_fields['f1594009471824'].valid === false\">{{nbd_fields['f1594009471824'].invalidOption}} is not available<\/div>\n            <\/div>\n<\/div><div class=\"nbd-option-field nbd-field-input-wrap  \" ng-if=\"nbd_fields['f1594009408625'].enable\">\n    <div class=\"nbd-field-header\">\n    <label for='nbd-field-f1594009408625'>\n        Please leave additional notes Below            <\/label> \n        <\/div>    <div class=\"nbd-field-content\">\n        <input \n                        ng-change=\"check_valid()\" \n                                    ng-model=\"nbd_fields['f1594009408625'].value\" class=\"nbd-input-t\"\n             name=\"nbd-field[f1594009408625]\" id=\"nbd-field-f1594009408625\"\n                        type=\"text\" pattern=\".{0}|.{0,}\" maxlength=\"200\"                                    placeholder=\"Pleaes let us know here\"\n                                    \/>\n                                        \n                        <span class=\"nbd-invalid-notice nbd-invalid-min\">Invalid value, min: 1<\/span>\n        <span class=\"nbd-invalid-notice nbd-invalid-max\">Invalid value, max: 100<\/span>\n            <\/div>\n<\/div>        <span class=\"nbo-group-toggle\" ng-click=\"toggle_group($event)\">\n            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                <path d=\"M16.594 8.578l1.406 1.406-6 6-6-6 1.406-1.406 4.594 4.594z\"\/>\n            <\/svg>\n        <\/span>\n    <\/div>\n    <\/div>\n            <div ng-if=\"fields.length\" class=\"nbo-clear-option-wrap\">\n                                                <a class=\"button nbd-button\" ng-click=\"reset_options()\">Clear selection<\/a>\n                            <\/div>\n            <input type=\"hidden\" value=\"1980\" name=\"nbo-add-to-cart\"\/>\n            <p ng-if=\"!valid_form\" class=\"nbd-invalid-form\">Please check invalid fields and quantity input or choose a different combination!<\/p>\n                    <\/div>\n        <div class=\"nbo-summary-wrapper\">\n                                    <div ng-if=\"valid_form\" class=\"nbo-table-summary-wrap nbo-style-1 \" >\n                <p class=\"nbo-summary-title\" ng-init=\"showNboSummary = true\">\n                    <b>Summary options<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboSummary\" ng-click=\"showNboSummary = !showNboSummary\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                                        <\/p>\n                <table class=\"nbo-summary-table\" ng-show=\"showNboSummary\">\n                    <tbody>\n                        <tr ng-repeat=\"(key, field) in nbd_fields\" ng-show=\"field.enable && field.published\">\n                            <td>{{field.title}} : <b>{{field.value_name}}<\/b>\n                                <br ng-if=\"field.ind_qty\" \/><small ng-if=\"field.ind_qty && field.price != ''\"> ( cart fee )<\/small>\n                                <br ng-if=\"field.fixed_amount\" \/><small ng-if=\"field.fixed_amount && field.price != ''\"> ( for all items )<\/small>\n                            <\/td>\n                            <td ng-bind-html=\"field.price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                    <tfoot style=\"border-top: 1px solid #404762;\">\n                        <tr>\n                            <td><b>Options price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_price | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr>\n                            <td><b>Quantity Discount<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"discount_by_qty | to_trusted\"><\/span> \/ 1 item<\/span><\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\">\n                            <td><b>Final price<\/b><\/td>\n                            <td>\n                                <span id=\"nbd-option-total\">\n                                    <span ng-hide=\"_qty == 1\" ng-bind-html=\"final_price | to_trusted\"><\/span><span ng-show=\"_qty == 1\" ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ 1 item                                <\/span>\n                            <\/td>\n                        <\/tr>\n                        <tr class=\"nbo-final-price\" ng-if=\"cart_item_fee.enable\">\n                            <td><b>Cart item fee<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"cart_item_fee.value | to_trusted\"><\/span> \/ all items<\/span><\/td>\n                        <\/tr>\n                                                <tr class=\"nbo-final-price nbo-total-price\" ng-if=\"_qty > 1\">\n                            <td><b>Subtotal price<\/b><\/td>\n                            <td><span id=\"nbd-option-total\"><span ng-bind-html=\"total_cart_price | to_trusted\"><\/span> \/ {{_qty}} items<\/span><\/td>\n                        <\/tr>\n                                            <\/tfoot>\n                <\/table>\n            <\/div>\n                                    <div ng-if=\"valid_form && price_table.length > 1\" class=\"nbo-table-pricing-wrap nbo-style-1\" >\n                <p class=\"nbo-table-pricing-title\" ng-init=\"showNboTablePricing = true\">\n                    <b>Table pricing<\/b>\n                                        <span class=\"nbo-minus nbo-toggle\" ng-show=\"showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13H5v-2h14v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                    <span class=\"nbo-plus nbo-toggle\" ng-show=\"!showNboTablePricing\" ng-click=\"showNboTablePricing = !showNboTablePricing\">\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><path d=\"M0 0h24v24H0z\" fill=\"none\"\/><\/svg>\n                    <\/span>\n                                    <\/p>\n                <table class=\"nbo-table-pricing\" ng-show=\"showNboTablePricing\">\n                                        <thead>\n                        <tr>\n                            <th>From<\/th>\n                            <th>Up to<\/th>\n                            <th>Price \/ 1 item<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n                        <tr ng-repeat=\"pt in price_table\" ng-class=\"pt.in_range ? 'nbo-bold' : ''\">\n                            <td>{{pt.from}}<\/td>\n                            <td>{{pt.up != '**' ? pt.up : 'or more'}}<\/td>\n                            <td ng-bind-html=\"pt.final_price | to_trusted\"><\/td>\n                        <\/tr>\n                    <\/tbody>\n                                    <\/table>\n            <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n<script type=\"text\/javascript\">\n    (function($){\n        $.fn.tipTip = function(options) {\n                var defaults = {\n                        activation: \"hover\",\n                        keepAlive: false,\n                        maxWidth: \"200px\",\n                        edgeOffset: 3,\n                        defaultPosition: \"bottom\",\n                        delay: 400,\n                        fadeIn: 200,\n                        fadeOut: 200,\n                        attribute: \"title\",\n                        content: false, \/\/ HTML or String to fill TipTIp with\n                        enter: function(){},\n                        exit: function(){}\n                };\n                var opts = $.extend(defaults, options);\n\n                \/\/ Setup tip tip elements and render them to the DOM\n                if($(\"#tiptip_holder\").length <= 0){\n                        var tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"><\/div>');\n                        var tiptip_content = $('<div id=\"tiptip_content\"><\/div>');\n                        var tiptip_arrow = $('<div id=\"tiptip_arrow\"><\/div>');\n                        $(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"><\/div>')));\n                } else {\n                        var tiptip_holder = $(\"#tiptip_holder\");\n                        var tiptip_content = $(\"#tiptip_content\");\n                        var tiptip_arrow = $(\"#tiptip_arrow\");\n                }\n\n                return this.each(function(){\n                        var org_elem = $(this);\n                        if(opts.content){\n                                var org_title = opts.content;\n                        } else {\n                                var org_title = org_elem.attr(opts.attribute);\n                        }\n                        if(org_title != \"\"){\n                                if(!opts.content){\n                                        org_elem.removeAttr(opts.attribute); \/\/remove original Attribute\n                                }\n                                var timeout = false;\n\n                                if(opts.activation == \"hover\"){\n                                        org_elem.hover(function(){\n                                                active_tiptip();\n                                        }, function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                } else if(opts.activation == \"focus\"){\n                                        org_elem.focus(function(){\n                                                active_tiptip();\n                                        }).blur(function(){\n                                                deactive_tiptip();\n                                        });\n                                } else if(opts.activation == \"click\"){\n                                        org_elem.click(function(){\n                                                active_tiptip();\n                                                return false;\n                                        }).hover(function(){},function(){\n                                                if(!opts.keepAlive){\n                                                        deactive_tiptip();\n                                                }\n                                        });\n                                        if(opts.keepAlive){\n                                                tiptip_holder.hover(function(){}, function(){\n                                                        deactive_tiptip();\n                                                });\n                                        }\n                                }\n\n                                function active_tiptip(){\n                                        opts.enter.call(this);\n                                        tiptip_content.html(org_title);\n                                        tiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\n                                        tiptip_arrow.removeAttr(\"style\");\n\n                                        var top = parseInt(org_elem.offset()['top']);\n                                        var left = parseInt(org_elem.offset()['left']);\n                                        var org_width = parseInt(org_elem.outerWidth());\n                                        var org_height = parseInt(org_elem.outerHeight());\n                                        var tip_w = tiptip_holder.outerWidth();\n                                        var tip_h = tiptip_holder.outerHeight();\n                                        var w_compare = Math.round((org_width - tip_w) \/ 2);\n                                        var h_compare = Math.round((org_height - tip_h) \/ 2);\n                                        var marg_left = Math.round(left + w_compare);\n                                        var marg_top = Math.round(top + org_height + opts.edgeOffset);\n                                        var t_class = \"\";\n                                        var arrow_top = \"\";\n                                        var arrow_left = Math.round(tip_w - 12) \/ 2;\n\n                    if(opts.defaultPosition == \"bottom\"){\n                        t_class = \"_bottom\";\n                        } else if(opts.defaultPosition == \"top\"){\n                                t_class = \"_top\";\n                        } else if(opts.defaultPosition == \"left\"){\n                                t_class = \"_left\";\n                        } else if(opts.defaultPosition == \"right\"){\n                                t_class = \"_right\";\n                        }\n\n                                        var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\n                                        var left_compare = (tip_w + left) > parseInt($(window).width());\n\n                                        if((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\n                                                t_class = \"_right\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left = -12;\n                                                marg_left = Math.round(left + org_width + opts.edgeOffset);\n                                                marg_top = Math.round(top + h_compare);\n                                        } else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\n                                                t_class = \"_left\";\n                                                arrow_top = Math.round(tip_h - 13) \/ 2;\n                                                arrow_left =  Math.round(tip_w);\n                                                marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\n                                                marg_top = Math.round(top + h_compare);\n                                        }\n\n                                        var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\n                                        var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\n\n                                        if(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\"){\n                                                        t_class = \"_top\";\n                                                } else {\n                                                        t_class = t_class+\"_top\";\n                                                }\n                                                arrow_top = tip_h;\n                                                marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\n                                        } else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\n                                                if(t_class == \"_top\" || t_class == \"_bottom\") {\n                                t_class = \"_bottom\";\n                            } else {\n                                t_class = t_class + \"_bottom\";\n                            }\n                            arrow_top = -12;\n                            marg_top = Math.round(top + org_height + opts.edgeOffset);\n                        }\n\n                        if (t_class == \"_right_top\" || t_class == \"_left_top\") {\n                            marg_top = marg_top + 5;\n                        } else if (t_class == \"_right_bottom\" || t_class == \"_left_bottom\") {\n                            marg_top = marg_top - 5;\n                        }\n                        if (t_class == \"_left_top\" || t_class == \"_left_bottom\") {\n                            marg_left = marg_left + 5;\n                        }\n                        tiptip_arrow.css({\"margin-left\": arrow_left + \"px\", \"margin-top\": arrow_top + \"px\"});\n                        tiptip_holder.css({\"margin-left\": marg_left + \"px\", \"margin-top\": marg_top + \"px\"}).attr(\"class\", \"tip\" + t_class);\n\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        timeout = setTimeout(function () {\n                            tiptip_holder.stop(true, true).fadeIn(opts.fadeIn);\n                        }, opts.delay);\n                    }\n\n                    function deactive_tiptip() {\n                        opts.exit.call(this);\n                        if (timeout) {\n                            clearTimeout(timeout);\n                        }\n                        tiptip_holder.fadeOut(opts.fadeOut);\n                    }\n                }\n            });\n        }\n    })(jQuery); \n\n    !function(a){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=a();else if(\"function\"==typeof define&&define.amd)define([],a);else{var b;b=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this,b.mexp=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error(\"Cannot find module '\"+g+\"'\");throw j.code=\"MODULE_NOT_FOUND\",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=a(\".\/postfix_evaluator.js\");d.prototype.formulaEval=function(){\"use strict\";for(var a,b,c,d=[],e=this.value,f=0;f<e.length;f++)1===e[f].type||3===e[f].type?d.push({value:3===e[f].type?e[f].show:e[f].value,type:1}):13===e[f].type?d.push({value:e[f].show,type:1}):0===e[f].type?d[d.length-1]={value:e[f].show+(\"-\"!=e[f].show?\"(\":\"\")+d[d.length-1].value+(\"-\"!=e[f].show?\")\":\"\"),type:0}:7===e[f].type?d[d.length-1]={value:(1!=d[d.length-1].type?\"(\":\"\")+d[d.length-1].value+(1!=d[d.length-1].type?\")\":\"\")+e[f].show,type:7}:10===e[f].type?(a=d.pop(),b=d.pop(),\"P\"===e[f].show||\"C\"===e[f].show?d.push({value:\"<sup>\"+b.value+\"<\/sup>\"+e[f].show+\"<sub>\"+a.value+\"<\/sub>\",type:10}):d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+\"<sup>\"+a.value+\"<\/sup>\",type:1})):2===e[f].type||9===e[f].type?(a=d.pop(),b=d.pop(),d.push({value:(1!=b.type?\"(\":\"\")+b.value+(1!=b.type?\")\":\"\")+e[f].show+(1!=a.type?\"(\":\"\")+a.value+(1!=a.type?\")\":\"\"),type:e[f].type})):12===e[f].type&&(a=d.pop(),b=d.pop(),c=d.pop(),d.push({value:e[f].show+\"(\"+c.value+\",\"+b.value+\",\"+a.value+\")\",type:12}));return d[0].value},b.exports=d},{\".\/postfix_evaluator.js\":5}],2:[function(a,b,c){function d(a,b){for(var c=0;c<a.length;c++)a[c]+=b;return a}function e(a,b,c,d){for(var e=0;e<d;e++)if(a[c+e]!==b[e])return!1;return!0}var f=a(\".\/math_function.js\"),g=[\"sin\",\"cos\",\"tan\",\"pi\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"int\",\"cosh\",\"acosh\",\"ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"\/\",\"!\",\"tanh\",\"atanh\",\"Mod\",\"1\",\"2\",\"3\",\"*\",\"sinh\",\"asinh\",\"e\",\"log\",\"0\",\".\",\"+\",\"-\",\",\",\"Sigma\",\"n\",\"Pi\",\"pow\"],h=[\"sin\",\"cos\",\"tan\",\"&pi;\",\"(\",\")\",\"P\",\"C\",\"asin\",\"acos\",\"atan\",\"7\",\"8\",\"9\",\"Int\",\"cosh\",\"acosh\",\" ln\",\"^\",\"root\",\"4\",\"5\",\"6\",\"&divide;\",\"!\",\"tanh\",\"atanh\",\" Mod \",\"1\",\"2\",\"3\",\"&times;\",\"sinh\",\"asinh\",\"e\",\" log\",\"0\",\".\",\"+\",\"-\",\",\",\"&Sigma;\",\"n\",\"&Pi;\",\"pow\"],i=[f.math.sin,f.math.cos,f.math.tan,\"PI\",\"(\",\")\",f.math.P,f.math.C,f.math.asin,f.math.acos,f.math.atan,\"7\",\"8\",\"9\",Math.floor,f.math.cosh,f.math.acosh,Math.log,Math.pow,Math.sqrt,\"4\",\"5\",\"6\",f.math.div,f.math.fact,f.math.tanh,f.math.atanh,f.math.mod,\"1\",\"2\",\"3\",f.math.mul,f.math.sinh,f.math.asinh,\"E\",f.math.log,\"0\",\".\",f.math.add,f.math.sub,\",\",f.math.sigma,\"n\",f.math.Pi,Math.pow],j={0:11,1:0,2:3,3:0,4:0,5:0,6:0,7:11,8:11,9:1,10:10,11:0,12:11,13:0},k=[0,0,0,3,4,5,10,10,0,0,0,1,1,1,0,0,0,0,10,0,1,1,1,2,7,0,0,2,1,1,1,2,0,0,3,0,1,6,9,9,11,12,13,12,8],l={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,9:!0,12:!0,13:!0},m={0:!0,1:!0,2:!0,3:!0,4:!0,5:!0,6:!0,7:!0,8:!0,9:!0,10:!0,11:!0,12:!0,13:!0},n={0:!0,3:!0,4:!0,8:!0,12:!0,13:!0},o={},p={0:!0,1:!0,3:!0,4:!0,6:!0,8:!0,12:!0,13:!0},q={1:!0},r=[[],[\"1\",\"2\",\"3\",\"7\",\"8\",\"9\",\"4\",\"5\",\"6\",\"+\",\"-\",\"*\",\"\/\",\"(\",\")\",\"^\",\"!\",\"P\",\"C\",\"e\",\"0\",\".\",\",\",\"n\"],[\"pi\",\"ln\",\"Pi\"],[\"sin\",\"cos\",\"tan\",\"Del\",\"int\",\"Mod\",\"log\",\"pow\"],[\"asin\",\"acos\",\"atan\",\"cosh\",\"root\",\"tanh\",\"sinh\"],[\"acosh\",\"atanh\",\"asinh\",\"Sigma\"]];f.addToken=function(a){for(var b=0;b<a.length;b++){var c=a[b].token.length,d=-1;if(c<r.length)for(var e=0;e<r[c].length;e++)if(a[b].token===r[c][e]){d=g.indexOf(r[c][e]);break}d===-1?(g.push(a[b].token),k.push(a[b].type),r.length<=a[b].token.length&&(r[a[b].token.length]=[]),r[a[b].token.length].push(a[b].token),i.push(a[b].value),h.push(a[b].show)):(g[d]=a[b].token,k[d]=a[b].type,i[d]=a[b].value,h[d]=a[b].show)}},f.lex=function(a,b){\"use strict\";var c,s,t,u,v={value:f.math.changeSign,type:0,pre:21,show:\"-\"},w={value:\")\",show:\")\",type:5,pre:0},x={value:\"(\",type:4,pre:0,show:\"(\"},y=[x],z=[],A=a,B=0,C=l,D=0,E=o,F=\"\";\"undefined\"!=typeof b&&f.addToken(b);var G={};for(s=0;s<A.length;s++)if(\" \"!==A[s]){for(c=\"\",t=A.length-s>r.length-2?r.length-1:A.length-s;t>0;t--)for(u=0;u<r[t].length;u++)e(A,r[t][u],s,t)&&(c=r[t][u],u=r[t].length,t=0);if(s+=c.length-1,\"\"===c)throw new f.Exception(\"Can't understand after \"+A.slice(s));var H,I=g.indexOf(c),J=c,K=k[I],L=i[I],M=j[K],N=h[I],O=y[y.length-1];for(H=z.length;H--&&0===z[H];)if([0,2,3,5,9,11,12,13].indexOf(K)!==-1){if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);y.push(w),C=m,E=p,d(z,-1).pop()}if(C[K]!==!0)throw new f.Exception(c+\" is not allowed after \"+F);if(E[K]===!0&&(K=2,L=f.math.mul,N=\"&times;\",M=3,s-=c.length),G={value:L,type:K,pre:M,show:N},0===K)C=l,E=o,d(z,2).push(2),y.push(G),y.push(x);else if(1===K)1===O.type?(O.value+=L,d(z,1)):y.push(G),C=m,E=n;else if(2===K)C=l,E=o,d(z,2),y.push(G);else if(3===K)y.push(G),C=m,E=p;else if(4===K)B+=z.length,z=[],D++,C=l,E=o,y.push(G);else if(5===K){if(!D)throw new f.Exception(\"Closing parenthesis are more than opening one, wait What!!!\");for(;B--;)y.push(w);B=0,D--,C=m,E=p,y.push(G)}else if(6===K){if(O.hasDec)throw new f.Exception(\"Two decimals are not allowed in one number\");1!==O.type&&(O={value:0,type:1,pre:0},y.push(O),d(z,-1)),C=q,d(z,1),E=o,O.value+=L,O.hasDec=!0}else 7===K&&(C=m,E=p,d(z,1),y.push(G));8===K?(C=l,E=o,d(z,4).push(4),y.push(G),y.push(x)):9===K?(9===O.type?O.value===f.math.add?(O.value=L,O.show=N,d(z,1)):O.value===f.math.sub&&\"-\"===N&&(O.value=f.math.add,O.show=\"+\",d(z,1)):5!==O.type&&7!==O.type&&1!==O.type&&3!==O.type&&13!==O.type?\"-\"===J&&(C=l,E=o,d(z,2).push(2),y.push(v),y.push(x)):(y.push(G),d(z,2)),C=l,E=o):10===K?(C=l,E=o,d(z,2),y.push(G)):11===K?(C=l,E=o,y.push(G)):12===K?(C=l,E=o,d(z,6).push(6),y.push(G),y.push(x)):13===K&&(C=m,E=p,y.push(G)),d(z,-1),F=c}for(H=z.length;H--&&0===z[H];)y.push(w),d(z,-1).pop();if(C[5]!==!0)throw new f.Exception(\"complete the expression\");for(;D--;)y.push(w);return y.push(w),new f(y)},b.exports=f},{\".\/math_function.js\":3}],3:[function(a,b,c){var d=function(a){this.value=a};d.math={isDegree:!0,acos:function(a){return d.math.isDegree?180\/Math.PI*Math.acos(a):Math.acos(a)},add:function(a,b){return a+b},asin:function(a){return d.math.isDegree?180\/Math.PI*Math.asin(a):Math.asin(a)},atan:function(a){return d.math.isDegree?180\/Math.PI*Math.atan(a):Math.atan(a)},acosh:function(a){return Math.log(a+Math.sqrt(a*a-1))},asinh:function(a){return Math.log(a+Math.sqrt(a*a+1))},atanh:function(a){return Math.log((1+a)\/(1-a))},C:function(a,b){var c=1,e=a-b,f=b;f<e&&(f=e,e=b);for(var g=f+1;g<=a;g++)c*=g;return c\/d.math.fact(e)},changeSign:function(a){return-a},cos:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.cos(a)},cosh:function(a){return(Math.pow(Math.E,a)+Math.pow(Math.E,-1*a))\/2},div:function(a,b){return a\/b},fact:function(a){if(a%1!==0)return\"NaN\";for(var b=1,c=2;c<=a;c++)b*=c;return b},inverse:function(a){return 1\/a},log:function(a){return Math.log(a)\/Math.log(10)},mod:function(a,b){return a%b},mul:function(a,b){return a*b},P:function(a,b){for(var c=1,d=Math.floor(a)-Math.floor(b)+1;d<=Math.floor(a);d++)c*=d;return c},Pi:function(a,b,c){for(var d=1,e=a;e<=b;e++)d*=Number(c.postfixEval({n:e}));return d},pow10x:function(a){for(var b=1;a--;)b*=10;return b},sigma:function(a,b,c){for(var d=0,e=a;e<=b;e++)d+=Number(c.postfixEval({n:e}));return d},sin:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.sin(a)},sinh:function(a){return(Math.pow(Math.E,a)-Math.pow(Math.E,-1*a))\/2},sub:function(a,b){return a-b},tan:function(a){return d.math.isDegree&&(a=d.math.toRadian(a)),Math.tan(a)},tanh:function(a){return d.sinha(a)\/d.cosha(a)},toRadian:function(a){return a*Math.PI\/180}},d.Exception=function(a){this.message=a},b.exports=d},{}],4:[function(a,b,c){var d=a(\".\/lexer.js\");d.prototype.toPostfix=function(){\"use strict\";for(var a,b,c,e,f,g=[],h=[{value:\"(\",type:4,pre:0}],i=this.value,j=1;j<i.length;j++)if(1===i[j].type||3===i[j].type||13===i[j].type)1===i[j].type&&(i[j].value=Number(i[j].value)),g.push(i[j]);else if(4===i[j].type)h.push(i[j]);else if(5===i[j].type)for(;4!==(b=h.pop()).type;)g.push(b);else if(11===i[j].type){for(;4!==(b=h.pop()).type;)g.push(b);h.push(b)}else{a=i[j],e=a.pre,f=h[h.length-1],c=f.pre;var k=\"Math.pow\"==f.value&&\"Math.pow\"==a.value;if(e>c)h.push(a);else{for(;c>=e&&!k||k&&e<c;)b=h.pop(),f=h[h.length-1],g.push(b),c=f.pre,k=\"Math.pow\"==a.value&&\"Math.pow\"==f.value;h.push(a)}}return new d(g)},b.exports=d},{\".\/lexer.js\":2}],5:[function(a,b,c){var d=a(\".\/postfix.js\");d.prototype.postfixEval=function(a){\"use strict\";a=a||{},a.PI=Math.PI,a.E=Math.E;for(var b,c,e,f=[],g=this.value,h=\"undefined\"!=typeof a.n,i=0;i<g.length;i++)1===g[i].type?f.push({value:g[i].value,type:1}):3===g[i].type?f.push({value:a[g[i].value],type:1}):0===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):7===g[i].type?\"undefined\"==typeof f[f.length-1].type?f[f.length-1].value.push(g[i]):f[f.length-1].value=g[i].value(f[f.length-1].value):8===g[i].type?(b=f.pop(),c=f.pop(),f.push({type:1,value:g[i].value(c.value,b.value)})):10===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(c.value=c.concat(b),c.value.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):2===g[i].type||9===g[i].type?(b=f.pop(),c=f.pop(),\"undefined\"==typeof c.type?(console.log(c),c=c.concat(b),c.push(g[i]),f.push(c)):\"undefined\"==typeof b.type?(b.unshift(c),b.push(g[i]),f.push(b)):f.push({type:1,value:g[i].value(c.value,b.value)})):12===g[i].type?(b=f.pop(),\"undefined\"!=typeof b.type&&(b=[b]),c=f.pop(),e=f.pop(),f.push({type:1,value:g[i].value(e.value,c.value,new d(b))})):13===g[i].type&&(h?f.push({value:a[g[i].value],type:3}):f.push([g[i]]));if(f.length>1)throw new d.exception(\"Uncaught Syntax error\");return f[0].value>1e15?\"Infinity\":parseFloat(f[0].value.toFixed(15))},d.eval=function(a,b,c){return\"undefined\"==typeof b?this.lex(a).toPostfix().postfixEval():\"undefined\"==typeof c?\"undefined\"!=typeof b.length?this.lex(a,b).toPostfix().postfixEval():this.lex(a).toPostfix().postfixEval(b):this.lex(a,b).toPostfix().postfixEval(c)},b.exports=d},{\".\/postfix.js\":4}]},{},[1])(1)});\n\n    !function(e){if(\"function\"==typeof define&&define.amd)define([\"jquery\"],e);else if(\"object\"==typeof exports){var n=require(\"jquery\");module.exports=e(n)}else e(window.jQuery||window.Zepto||window.$)}(function(e){\"use strict\";e.fn.serializeJSON=function(n){var r,s,t,i,a,u,l,o,p,c,d,f,y;return r=e.serializeJSON,s=this,t=r.setupOpts(n),i=s.serializeArray(),r.readCheckboxUncheckedValues(i,t,s),a={},e.each(i,function(e,n){u=n.name,l=n.value,p=r.extractTypeAndNameWithNoType(u),c=p.nameWithNoType,(d=p.type)||(d=r.attrFromInputWithName(s,u,\"data-value-type\")),r.validateType(u,d,t),\"skip\"!==d&&(f=r.splitInputNameIntoKeysArray(c),o=r.parseValue(l,u,d,t),(y=!o&&r.shouldSkipFalsy(s,u,c,d,t))||r.deepSet(a,f,o,t))}),a},e.serializeJSON={defaultOptions:{checkboxUncheckedValue:void 0,parseNumbers:!1,parseBooleans:!1,parseNulls:!1,parseAll:!1,parseWithFunction:null,skipFalsyValuesForTypes:[],skipFalsyValuesForFields:[],customTypes:{},defaultTypes:{string:function(e){return String(e)},number:function(e){return Number(e)},boolean:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)},null:function(e){return-1===[\"false\",\"null\",\"undefined\",\"\",\"0\"].indexOf(e)?e:null},array:function(e){return JSON.parse(e)},object:function(e){return JSON.parse(e)},auto:function(n){return e.serializeJSON.parseValue(n,null,null,{parseNumbers:!0,parseBooleans:!0,parseNulls:!0})},skip:null},useIntKeysAsArrayIndex:!1},setupOpts:function(n){var r,s,t,i,a,u;u=e.serializeJSON,null==n&&(n={}),t=u.defaultOptions||{},s=[\"checkboxUncheckedValue\",\"parseNumbers\",\"parseBooleans\",\"parseNulls\",\"parseAll\",\"parseWithFunction\",\"skipFalsyValuesForTypes\",\"skipFalsyValuesForFields\",\"customTypes\",\"defaultTypes\",\"useIntKeysAsArrayIndex\"];for(r in n)if(-1===s.indexOf(r))throw new Error(\"serializeJSON ERROR: invalid option '\"+r+\"'. Please use one of \"+s.join(\", \"));return i=function(e){return!1!==n[e]&&\"\"!==n[e]&&(n[e]||t[e])},a=i(\"parseAll\"),{checkboxUncheckedValue:i(\"checkboxUncheckedValue\"),parseNumbers:a||i(\"parseNumbers\"),parseBooleans:a||i(\"parseBooleans\"),parseNulls:a||i(\"parseNulls\"),parseWithFunction:i(\"parseWithFunction\"),skipFalsyValuesForTypes:i(\"skipFalsyValuesForTypes\"),skipFalsyValuesForFields:i(\"skipFalsyValuesForFields\"),typeFunctions:e.extend({},i(\"defaultTypes\"),i(\"customTypes\")),useIntKeysAsArrayIndex:i(\"useIntKeysAsArrayIndex\")}},parseValue:function(n,r,s,t){var i,a;return i=e.serializeJSON,a=n,t.typeFunctions&&s&&t.typeFunctions[s]?a=t.typeFunctions[s](n):t.parseNumbers&&i.isNumeric(n)?a=Number(n):!t.parseBooleans||\"true\"!==n&&\"false\"!==n?t.parseNulls&&\"null\"==n?a=null:t.typeFunctions&&t.typeFunctions.string&&(a=t.typeFunctions.string(n)):a=\"true\"===n,t.parseWithFunction&&!s&&(a=t.parseWithFunction(a,r)),a},isObject:function(e){return e===Object(e)},isUndefined:function(e){return void 0===e},isValidArrayIndex:function(e){return\/^[0-9]+$\/.test(String(e))},isNumeric:function(e){return e-parseFloat(e)>=0},optionKeys:function(e){if(Object.keys)return Object.keys(e);var n,r=[];for(n in e)r.push(n);return r},readCheckboxUncheckedValues:function(n,r,s){var t,i,a;null==r&&(r={}),e.serializeJSON,t=\"input[type=checkbox][name]:not(:checked):not([disabled])\",s.find(t).add(s.filter(t)).each(function(s,t){if(i=e(t),null==(a=i.attr(\"data-unchecked-value\"))&&(a=r.checkboxUncheckedValue),null!=a){if(t.name&&-1!==t.name.indexOf(\"[][\"))throw new Error(\"serializeJSON ERROR: checkbox unchecked values are not supported on nested arrays of objects like '\"+t.name+\"'. See https:\/\/github.com\/marioizquierdo\/jquery.serializeJSON\/issues\/67\");n.push({name:t.name,value:a})}})},extractTypeAndNameWithNoType:function(e){var n;return(n=e.match(\/(.*):([^:]+)$\/))?{nameWithNoType:n[1],type:n[2]}:{nameWithNoType:e,type:null}},shouldSkipFalsy:function(n,r,s,t,i){var a=e.serializeJSON.attrFromInputWithName(n,r,\"data-skip-falsy\");if(null!=a)return\"false\"!==a;var u=i.skipFalsyValuesForFields;if(u&&(-1!==u.indexOf(s)||-1!==u.indexOf(r)))return!0;var l=i.skipFalsyValuesForTypes;return null==t&&(t=\"string\"),!(!l||-1===l.indexOf(t))},attrFromInputWithName:function(e,n,r){var s,t;return s=n.replace(\/(:|\\.|\\[|\\]|\\s)\/g,\"\\\\$1\"),t='[name=\"'+s+'\"]',e.find(t).add(e.filter(t)).attr(r)},validateType:function(n,r,s){var t,i;if(i=e.serializeJSON,t=i.optionKeys(s?s.typeFunctions:i.defaultOptions.defaultTypes),r&&-1===t.indexOf(r))throw new Error(\"serializeJSON ERROR: Invalid type \"+r+\" found in input name '\"+n+\"', please use one of \"+t.join(\", \"));return!0},splitInputNameIntoKeysArray:function(n){var r;return e.serializeJSON,r=n.split(\"[\"),\"\"===(r=e.map(r,function(e){return e.replace(\/\\]\/g,\"\")}))[0]&&r.shift(),r},deepSet:function(n,r,s,t){var i,a,u,l,o,p;if(null==t&&(t={}),(p=e.serializeJSON).isUndefined(n))throw new Error(\"ArgumentError: param 'o' expected to be an object or array, found undefined\");if(!r||0===r.length)throw new Error(\"ArgumentError: param 'keys' expected to be an array with least one element\");i=r[0],1===r.length?\"\"===i?n.push(s):n[i]=s:(a=r[1],\"\"===i&&(o=n[l=n.length-1],i=p.isObject(o)&&(p.isUndefined(o[a])||r.length>2)?l:l+1),\"\"===a?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):t.useIntKeysAsArrayIndex&&p.isValidArrayIndex(a)?!p.isUndefined(n[i])&&e.isArray(n[i])||(n[i]=[]):!p.isUndefined(n[i])&&p.isObject(n[i])||(n[i]={}),u=r.slice(1),p.deepSet(n[i],u,s,t))}}});\n    \n    var in_quick_view = 0;\n    var nbOption = {\n        status: false,\n        initialed: false,\n        options: {\"version\":\"285\",\"quantity_enable\":\"n\",\"quantity_type\":\"r\",\"quantity_min\":\"1\",\"quantity_max\":\"100\",\"quantity_step\":\"1\",\"quantity_discount_type\":\"p\",\"quantity_breaks\":[{\"val\":\"3\",\"dis\":\"10\"}],\"fields\":[{\"id\":\"f1594258039088\",\"general\":{\"title\":\"Would you like to print your books\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Yes, print my books\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1593989394990\",\"general\":{\"title\":\"Paper Type\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Standard Paper- 100gsm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Economy Paper - 80gsm\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Premium Quality Paper - 160gsm \",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003765618\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.18\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594003984918\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.68\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004768125\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.11\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004770828\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.5\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004830503\",\"general\":{\"title\":\"Black & White Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"0.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594004832682\",\"general\":{\"title\":\"Colour Page\",\"description\":\"A page is one side of a sheet. Please be accurate here, books will not proceed if this is incorrect.\",\"data_type\":\"i\",\"input_type\":\"n\",\"input_option\":{\"min\":\"0\",\"max\":\"1000\",\"step\":\"1\",\"default\":\"0\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"y\",\"price_type\":\"c\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"1.38\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Front side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Back side\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]},\"auto_select_page\":\"y\",\"page_display\":\"1\",\"exclude_page\":\"0\"},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1593989394990\",\"operator\":\"i\",\"val\":\"2\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"page\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005174967\",\"general\":{\"title\":\"Single & Double Sided Printing\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Single Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Double Sided\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005142537\",\"general\":{\"title\":\"Binding Style\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Landscape) 11x14'' \\\/ 28x35cm\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"(Portrait) 14x11'' \\\/ 35x28cm\",\"des\":\"\",\"price\":[\"00\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbd_type\":\"orientation\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594038618358\",\"general\":{\"title\":\"Upgrade turnaround time\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not required, Standard 5 days\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+90, Upgrade to 3 days\",\"des\":\"\",\"price\":[\"90\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"+120, Upgrade to 24 Hour\",\"des\":\"\",\"price\":[\"120\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"ad\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/advanced-dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005480448\",\"general\":{\"title\":\"Cover Colour\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#000000\",\"name\":\"Buckram - Black\",\"des\":\"\",\"price\":[\"0\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#1e73be\",\"name\":\"Buckram - Blue\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#dd3333\",\"name\":\"Buckram - Red\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"c\",\"image\":\"0\",\"color\":\"#426018\",\"name\":\"Buckram - Green\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Black\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Leatherette - Burgundy\",\"des\":\"\",\"price\":[\"10\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"s\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/swatch.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008130155\",\"general\":{\"title\":\"Gold Lettering\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine + Front Cover\",\"des\":\"\",\"price\":[\"11.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Spine Only\",\"des\":\"\",\"price\":[\"8.8\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"No Gold Lettering\",\"selected\":\"on\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007067185\",\"general\":{\"title\":\"Cover Title\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Type your thesis title here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594007068623\",\"general\":{\"title\":\"Cover Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type your thesis Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008400487\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"150\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008404745\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008883618\",\"general\":{\"title\":\"Shortened title for Spine\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine title here, maximum: 45-50 characters;\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594008880872\",\"general\":{\"title\":\"Spine Author\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"100\"},\"placeholder\":\"Type Spine Author here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594008130155\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005757318\",\"general\":{\"title\":\"How would you like to upload books?\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload here\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"u\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Upload to Google drive and Dropbox\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\",\"action\":\"h\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594258039088\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"r\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"nbe_type\":\"actions\",\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/radio.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005832365\",\"general\":{\"title\":\"Upload Your books here\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"u\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"999\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"pdf,zip,rar\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"0\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594005837304\",\"general\":{\"title\":\"Google drive and Dropbox Download Link\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"a\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"y\",\"show\":\"y\",\"logic\":\"a\",\"depend\":[{\"id\":\"f1594005757318\",\"operator\":\"i\",\"val\":\"1\"}]},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/textarea.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009471824\",\"general\":{\"title\":\"University\",\"description\":\"\",\"data_type\":\"m\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Auckland\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Victoria University of Wellington\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Massey University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Waikato\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Otago\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Lincoln University\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"University of Canterbury\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"},{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Not above\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/dropdown.php\",\"need_show\":true,\"class\":\" \"},{\"id\":\"f1594009408625\",\"general\":{\"title\":\"Please leave additional notes Below\",\"description\":\"\",\"data_type\":\"i\",\"input_type\":\"t\",\"input_option\":{\"min\":\"1\",\"max\":\"100\",\"step\":\"1\",\"default\":\"1\"},\"text_option\":{\"min\":\"0\",\"max\":\"200\"},\"placeholder\":\"Pleaes let us know here\",\"upload_option\":{\"min_size\":\"0\",\"max_size\":\"100\",\"allow_type\":\"png,jpg,jpeg\"},\"enabled\":\"y\",\"published\":\"y\",\"required\":\"n\",\"price_type\":\"f\",\"depend_qty\":\"y\",\"depend_quantity\":\"n\",\"price\":\"\",\"price_breaks\":[\"\"],\"attributes\":{\"options\":[{\"preview_type\":\"i\",\"image\":\"0\",\"color\":\"#ffffff\",\"name\":\"Attribute name\",\"des\":\"\",\"price\":[\"\"],\"implicit_value\":\"\"}]}},\"conditional\":{\"enable\":\"n\"},\"appearance\":{\"display_type\":\"d\",\"change_image_product\":\"n\",\"show_in_archives\":\"n\",\"css_class\":\"\"},\"show_in_group\":true,\"template\":\"\\\/var\\\/www\\\/html\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/templates\\\/single-product\\\/options-builder\\\/input.php\",\"need_show\":true,\"class\":\" \"}],\"views\":[{\"name\":\"View name\",\"base\":\"0\",\"base_width\":\"\",\"base_height\":\"\",\"base_url\":\"https:\\\/\\\/mythesis.co.nz\\\/wp-content\\\/plugins\\\/web-to-print-online-designer\\\/assets\\\/images\\\/placeholder.png\"}],\"display_type\":\"4\",\"groups\":[{\"image\":\"0\",\"title\":\"Page Count (A page is one side of a sheet. Please be accurate below)\",\"des\":\"\",\"note\":\"\",\"cols\":\"3\",\"fields\":[\"f1593989394990\",\"f1594003765618\",\"f1594003984918\",\"f1594004768125\",\"f1594004770828\",\"f1594004830503\",\"f1594004832682\",\"f1594005174967\"]},{\"image\":\"0\",\"title\":\"Binding Cover and Turnaround time \",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594005142537\",\"f1594038618358\",\"f1594005480448\",\"f1594008130155\",\"f1594007067185\",\"f1594007068623\",\"f1594008400487\",\"f1594008404745\",\"f1594008883618\",\"f1594008880872\"]},{\"image\":\"0\",\"title\":\"Upload Thesis \",\"des\":\"\",\"note\":\"\",\"cols\":\"1\",\"fields\":[\"f1594005757318\",\"f1594005832365\",\"f1594005837304\"]},{\"image\":\"0\",\"title\":\"Extras\",\"des\":\"\",\"note\":\"\",\"cols\":\"2\",\"fields\":[\"f1594009471824\",\"f1594009408625\"]}],\"popup_trigger_field\":\"\",\"matrix_type\":1},\n        bulk_fields: [],\n        nbd_fields: {},\n        odOption: {},\n        extraOdOption: {},\n        lastOdOption: {},\n        lastExtraOdOption: {},\n        crtlId: 'nbo-ctrl-nbo-app-1779018420653',\n        updateVariations: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.updateVariations();\n        },\n        updateBulkPrice: function(){\n            var scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            scope.calculate_bulk_total_price();\n        },\n        enable_gallery_api: 0,\n        template_folder: \"\",\n        options_str: '',\n        prev_options_str: '',\n        gallery: {},\n        gallery_url: \"https:\/\/mythesis.co.nz\/wp-content\/uploads\/nbdesigner\/gallery\",\n        design_stored: 0,\n        has_delivery: 0,\n        delivery_field_id: '',\n        delivery_count: parseInt(0)\n    };\n    jQuery('.variations_form').on('woocommerce_variation_has_changed wc_variation_form', function(){\n        startApp();\n    });\n    jQuery('.variations_form').on('found_variation', function(){\n        setTimeout(function(){\n            startApp();\n        }, 100);\n    });\n    function _debounce(func, wait, immediate) {\n        var timeout;\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !timeout;\n            clearTimeout(timeout);\n            timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    };\n    jQuery(document).ready(function(){\n                var changeQtyFn = function(event){\n                if( event.namespace == 'nbo' ){\n                    startApp();\n                }else{\n                    startApp( true );\n                }\n            };\n                jQuery('input[name=\"quantity\"]').on('input change change.nbo', changeQtyFn);\n                jQuery('#nbd-trigger-nbo-popup').on('click', function(){\n            jQuery('#nbo-detail-popup-wrap').showNBDPopup();\n        });\n        jQuery('#nbo-sumit-popup-action').on('click', function(){\n            jQuery('.single_add_to_cart_button').trigger('click');\n            jQuery('#nbo-detail-popup-wrap .popup-inner').trigger('click');\n        });\n    });\n    function startApp( updateQty ){\n        if( nbOption.status ){\n            var scope = angular.element(document.getElementById(\"nbo-ctrl-nbo-app-1779018420653\")).scope();\n            scope.mapOptions();\n            if( angular.isDefined(updateQty) ){\n                if( nbOption.has_delivery ){\n                    scope.update_delivery_date();\n                }\n            }\n            scope.check_valid();\n            scope.update_app(); \n                    }\n    };\n    var option_selector = \"\";\n    var quantity_selector = '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus, .quantity-plus, .quantity-minus';\n    var qty_selector = option_selector != '' ? quantity_selector + ', ' + option_selector : quantity_selector;\n    jQuery(document).off('click.nbo', qty_selector)\n            .on('click.nbo', qty_selector, function(){\n                jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n            });\n        var nboApp = angular.module('nboApp', []);\n    \n    function nbo_variation_calculator(variation_attributes, product_variations, all_set_callback, not_all_set_callback) {\n        this.recalc_needed = true;\n\n        this.all_set_callback = all_set_callback;\n        this.not_all_set_callback = not_all_set_callback;\n        this.variation_attributes = variation_attributes;\n        this.variations_available = product_variations;\n        this.variations_current = {};\n        this.variations_selected = {};\n\n        this.reset_current = function () {\n            for (var attribute in this.variation_attributes) {\n                this.variations_current[attribute] = {};\n                for (var av = 0; av < this.variation_attributes[attribute].length; av++) {\n                    this.variations_current[attribute.toString()][this.variation_attributes[attribute][av].toString()] = 0;\n                }\n            }\n        };\n\n        this.update_current = function () {\n            this.reset_current();\n            for ( var i = 0; i < this.variations_available.length; i++ ) {\n                if ( !this.variations_available[i].variation_is_active ) {\n                    continue;\n                }\n\n                var variation_attributes = this.variations_available[i].attributes;\n\n                for ( var attribute in variation_attributes ) {\n                    var maybe_available_attribute_value = variation_attributes[attribute];\n                    var selected_value = this.variations_selected[attribute];\n\n                    if ( selected_value && selected_value == maybe_available_attribute_value ) {\n                        this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                    } else {\n                        var result = true;\n                        for ( var other_selected_attribute in this.variations_selected ) {\n                            if (other_selected_attribute == attribute) {\n                                continue;\n                            }\n\n                            var other_selected_attribute_value = this.variations_selected[other_selected_attribute];\n                            var other_available_attribute_value = variation_attributes[other_selected_attribute];\n\n                            if (other_selected_attribute_value) {\n                                if (other_available_attribute_value) {\n                                    if (other_selected_attribute_value != other_available_attribute_value) {\n                                        result = false;\n                                    }\n                                }\n                            }\n                        }\n                        if (result) {\n                            if (maybe_available_attribute_value === \"\") {\n                                for (var av in this.variations_current[attribute]) {\n                                    this.variations_current[attribute][av] = 1;\n                                }\n                            } else {\n                                this.variations_current[attribute][maybe_available_attribute_value] = 1;\n                            }\n                        }\n                    }\n                }\n            }\n            this.recalc_needed = false;\n        };\n\n        this.get_current = function () {\n            if (this.recalc_needed) {\n                this.update_current();\n            }\n            return this.variations_current;\n        };\n\n        this.reset_selected = function () {\n            this.recalc_needed = true;\n            this.variations_selected = {};\n        }\n\n        this.set_selected = function (key, value) {\n            this.recalc_needed = true;\n            this.variations_selected[key] = value;\n        };\n\n        this.get_selected = function () {\n            return this.variations_selected;\n        }\n    };\n\n    nboApp.controller('optionCtrl', ['$scope', '$timeout', function($scope, $timeout){\n        $scope.product_id = 1980;\n        $scope.options = nbOption.options;\n        $scope.bulk_fields = nbOption.bulk_fields;\n        $scope.fields = $scope.options[\"fields\"];\n        $scope.price = \"368\";\n        $scope.type = \"simple\";\n        $scope.width = parseFloat();\n        $scope.height = parseFloat();\n        $scope.variations = [];\n        $scope.dimensions = [];\n        $scope.form_values = [];\n        $scope.is_sold_individually = \"\";\n        $scope.artwork_action = \"\";\n        $scope._quantity = \"1\";\n        $scope.ajax_url = \"https:\/\/mythesis.co.nz\/wp-admin\/admin-ajax.php\";\n        $scope.valid_form = false;\n        $scope.product_image = [];\n        $scope.product_img = [];\n        $scope.price_table = [];\n        $scope.turnaround_matrix = [];\n        $scope.has_price_matrix = false;\n        $scope.can_start_design = true;\n        $scope.custom_quantity = false;\n        $scope.current_group_panel = 0;\n        $scope.total_cart_item_price_num = 0;\n        $scope.check_valid = function( calculate_pm, pro ){\n            $timeout(function(){\n                $scope.$emit( \"nbo_options_changed\", $scope.nbd_fields );\n                var check = {}, total_check = true, show_popup_trigger = false;\n                angular.forEach($scope.nbd_fields, function(field, field_id){\n                    $scope.check_depend(field_id);\n                    field.valid = true;\n                    field.invalidOption = '';\n                    check[field_id] = ( field.enable && field.required == 'y' && (field.value === '' || angular.isUndefined(field.value) ) ) ? false : true;\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isUndefined( origin_field.general.published ) ){\n                        field.published = true;\n                    } else {\n                        field.published = origin_field.general.published == 'y' ? true : false;\n                    }\n                    if( angular.isUndefined( origin_field.show_in_group ) ){\n                        field.show_in_group = false;\n                    } else {\n                        field.show_in_group = origin_field.show_in_group;\n                    }\n                    if( origin_field.general.data_type == 'i' ){\n                        if( origin_field.general.input_type != 't' && origin_field.general.input_type != 'a' ){\n                            if( angular.isUndefined(field.value) ) check[field_id] = false;\n                            if( origin_field.general.input_type == 'u' && field.required != 'y' ) check[field_id] = true;\n                        }else{\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                                if( angular.isUndefined(field.width) || angular.isUndefined(field.height) ){\n                                    check[field_id] = false;\n                                }\n                            }else if( angular.isDefined(field.value) ){\n                                if( field.enable && field.required == 'y' ){\n                                    if( angular.isDefined(origin_field.general.text_option.min) && origin_field.general.text_option.min != '' ){\n                                        var min = $scope.validate_int(origin_field.general.text_option.min);\n                                        if( field.value.length < min ) check[field_id] = false;\n                                    }\n                                    if( angular.isDefined(origin_field.general.text_option.max) && origin_field.general.text_option.max != '' ){\n                                        var max = $scope.validate_int(origin_field.general.text_option.max);\n                                        if( field.value.length > max ) check[field_id] = false;\n                                    }\n                                }\n                            }\n                        }\n                        field.value_name = '';\n                        if( angular.isDefined(field.value) ){\n                            if( origin_field.general.input_type != 'u' ){\n                                field.value_name = field.value;\n                            }else if( angular.isDefined(field.value.name) ){\n                                field.value_name = field.value.name;\n                            }\n                        }\n                    }else{\n                        if( angular.isDefined(field.values) ){\n                            field.value_name = '';\n                            angular.forEach(field.values, function(val, index){\n                                field.value_name += (index == 0 ? '' : ', ') + origin_field.general.attributes.options[val].name;\n                            });\n                            if( origin_field.nbd_type == \"page\" || origin_field.nbd_type == \"page2\"  ){\n                                $scope.can_start_design = field.values.length == 0 ? false: true;\n                            }\n                        }else{\n                            var selected_option = origin_field.general.attributes.options[field.value];\n                            field.value_name = selected_option.name;\n                            if( angular.isDefined($scope.nbd_fields[field_id]) ){\n                                $scope.nbd_fields[field_id].form_name = '';\n                                if( angular.isDefined(selected_option.enable_subattr) && selected_option.enable_subattr == 'on' ){\n                                    if( angular.isDefined(selected_option.sub_attributes) && selected_option.sub_attributes.length > 0 ){\n                                        $scope.nbd_fields[field_id].form_name = selected_option.form_name;\n                                        if( angular.isUndefined( selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value] ) ){\n                                            $scope.nbd_fields[field_id].sub_value = '0';\n                                        }\n                                        field.value_name += ' - ' + selected_option.sub_attributes[$scope.nbd_fields[field_id].sub_value].name;\n                                    }\n                                }\n                                if( origin_field.appearance.display_type == 'ad' ){\n                                    $scope.nbd_fields[field_id].form_name = '[value]';\n                                }\n                            }\n                            if( origin_field.nbe_type == 'actions' ){\n                                var action = selected_option.action;\n                                if( !( action == 'u' || action == 'c' ) ){\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').hide();\n                                    if( jQuery('.nbd-force-ignore-design').length == 0 ){\n                                        jQuery('form.cart').append('<input type=\"hidden\" value=\"1\" name=\"nbd-force-ignore-design\" class=\"nbd-force-ignore-design\" \/>');\n                                    }\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').show();\n                                    };\n                                }else{\n                                    jQuery('#triggerDesign, #startDesign, #startUpload, #useTemplate').show();\n                                    if( action == 'u' ){\n                                        jQuery('#startDesign, #useTemplate').hide();\n                                    }else{\n                                        jQuery('#startUpload').hide();\n                                    }\n                                    jQuery('form.cart').find('.nbd-force-ignore-design').remove();\n                                    if( ( jQuery('#triggerDesign').length > 0 || jQuery('#startDesign').length > 0 || jQuery('#startUpload').length > 0 ) && angular.isDefined( nbds_frontend ) && nbds_frontend.hide_cart_button == 'yes'){\n                                        jQuery('button[type=\"submit\"].single_add_to_cart_button').hide();\n                                    };\n                                }\n                            }\n\n                            if( origin_field.general.attributes.options.length ){\n                                origin_field.general.attributes.options.forEach(function(op, opIndex){\n                                    $scope.checkAttributeStatus( field_id, opIndex );\n\n                                    if( angular.isDefined( op.enable_subattr ) && op.enable_subattr == 'on' && op.sub_attributes.length > 0 ){\n                                        op.sub_attributes.forEach(function(sop, sopIndex){\n                                            $scope.checkAttributeStatus( field_id, opIndex, sopIndex );\n                                        });\n                                    }\n                                });\n\n                                if( !$scope.status_fields[field_id][field.value].enable ){\n                                    check[field_id] = false;\n                                    field.valid = false;\n                                    field.invalidOption = selected_option.name;\n                                }\n\n                                if( angular.isDefined( field.sub_value ) ){\n                                    if( angular.isDefined( selected_option.enable_subattr ) && selected_option.enable_subattr == 'on' && selected_option.sub_attributes.length > 0 ){\n                                        var selected_sub_option = selected_option.sub_attributes[field.sub_value];\n                                        if( !$scope.status_fields[field_id][field.value].sub_attributes[field.sub_value] ){\n                                            check[field_id] = false;\n                                            field.valid = false;\n                                            field.invalidOption = selected_sub_option.name;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( angular.isDefined( origin_field.nbd_type ) && origin_field.nbd_type == 'shape' ){\n                                field.shape = selected_option.shape;\n                            }\n                        }\n                    }\n                    if( !field.enable ) check[field_id] = true;\n                    if( $scope.options.display_type == 6 ){\n                        if( field_id == $scope.options.popup_trigger_field && field.value == $scope.options.popup_trigger_value ){\n                            show_popup_trigger = true;\n                        }\n                    }\n                });\n                if( show_popup_trigger ){\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'inline-block');\n                    jQuery('.single_add_to_cart_button').addClass('nbop-hidden');\n                }else{\n                    jQuery('#nbd-trigger-nbo-popup').css('display', 'none');\n                    jQuery('.single_add_to_cart_button').removeClass('nbop-hidden');\n                }\n                angular.forEach(check, function(c){\n                    total_check = total_check && c;\n                });\n                \/*if( $scope.options.display_type == 3 ){\n                    var check_bulk_quantity = false;\n                    if( jQuery('.nbb-qty-field').length == 0 ) check_bulk_quantity = true;\n                    jQuery.each(jQuery('.nbb-qty-field'), function(key, el){\n                        if(jQuery(el).val() != '') check_bulk_quantity = true;\n                    });\n                    total_check = total_check && check_bulk_quantity;\n                }*\/\n                if( total_check ){\n                    $scope.postOptionsToEditor();\n                    $scope.calculate_price();\n                                                            $scope.calculate_price_table();\n                                        if( nbOption.has_delivery ){\n                        $scope.calc_turnaround_matrix();\n                    }\n                    $scope.valid_form = true;\n                    jQuery('.single_add_to_cart_button').removeClass( \"nbo-disabled nbo-hidden\");\n                    jQuery('.variations_form, form.cart').find('[name=\"nbo-ignore-design\"]').remove();\n                    if($scope.can_start_design){\n                        if( $scope.type == 'variable' ){\n                            var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                            if( variation_id != '' && variation_id != 0  ){\n                                jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                            }\n                        }else{\n                            jQuery('#triggerDesign').removeClass('nbdesigner_disable');\n                        }\n                    }else{\n                        jQuery('.variations_form, form.cart').append('<input name=\"nbo-ignore-design\" type=\"hidden\" value=\"1\" \/>');\n                        jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    };\n                    jQuery(document).triggerHandler( 'nbo_valid_form' );\n                }else{\n                    jQuery(document).triggerHandler( 'invalid_nbo_options' );\n                    jQuery('.single_add_to_cart_button').addClass( \"nbo-disabled\");\n                    if( nbds_frontend.nbdesigner_hide_add_cart_until_form_filled == 'yes' ){\n                        jQuery('.single_add_to_cart_button').addClass( \"nbo-hidden\");\n                    }\n                    $scope.valid_form = false;\n                    jQuery('#triggerDesign').addClass('nbdesigner_disable');\n                    jQuery(document).triggerHandler( 'nbo_invalid_form' );\n                }\n                $scope.may_be_change_product_image();\n                if( $scope.has_price_matrix && ( angular.isUndefined( calculate_pm ) || calculate_pm ) ){\n                    $scope.calculate_price_matrix();\n                }\n                angular.copy($scope.nbd_fields, nbOption.nbd_fields);\n                if( !nbOption.initialed ){\n                    jQuery(document).triggerHandler( 'initialed_nbo_options' );\n                    nbOption.initialed = true;\n                    function inIframe() {\n                        try {\n                            return window.self !== window.top;\n                        } catch (e) {\n                            return true;\n                        }\n                    }\n                    if( inIframe() ){\n                        window.parent.postMessage('initialed_nbo_options', window.location.origin);\n                    }\n                }else{\n                    jQuery(document).triggerHandler( 'update_nbo_options', { pro: pro } );\n                };\n\n                var preventEnter = function(event){\n                    if( event.keyCode == 13 ) {\n                        event.preventDefault();\n                        return false;\n                    }\n                };\n                jQuery('.variations_form input, form.cart input').off('keydown', preventEnter).on('keydown', preventEnter);\n\n                if( nbOption.delivery_count > 1 && !$scope.nbd_fields[nbOption.delivery_field_id].enable ){\n                    var first = true, delivery_field_id;\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var origin_field = $scope.get_field(field_id);\n                        if( origin_field.general.enabled == 'y' && origin_field.general.published == 'y' && angular.isDefined( origin_field.nbe_type )\n                             && origin_field.nbe_type == 'delivery' & angular.isDefined( origin_field.general.attributes ) && angular.isDefined( origin_field.general.attributes.options ) \n                             && origin_field.general.attributes.options.length > 0 && first && $scope.nbd_fields[field_id].enable ){\n                            delivery_field_id = origin_field.id;\n                            first = false;\n                        }\n                    });\n                    if( delivery_field_id ){\n                        nbOption.delivery_field_id = delivery_field_id;\n                        $scope.init_turnaround_matrix();\n                        $scope.calc_turnaround_matrix();\n                    }\n                }\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, -1 );\n                }\n                jQuery(document).triggerHandler( 'trigger_nbo_options_changed', {fields: $scope.nbd_fields, pro: pro} );\n\n                $scope.update_app();\n            });\n        };\n        $scope.postOptionsToEditor = function(){\n            angular.copy( nbOption.odOption, nbOption.lastOdOption );\n            angular.copy( nbOption.extraOdOption, nbOption.lastExtraOdOption );\n            nbOption.odOption = {};\n            nbOption.extraOdOption = {};\n            var options_str = '';\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if(field.enable){\n                    var origin_field = $scope.get_field(field_id);\n                    if( angular.isDefined(origin_field.nbd_type) ){\n                        switch(origin_field.nbd_type){\n                            case 'dpi':\n                                nbOption.odOption.dpi = $scope.validate_int( field.value );\n                                break;\n                            case 'color':\n                                var option_color = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.color = {\n                                    bg_type: origin_field.general.attributes.bg_type,\n                                    bg_color: option_color.bg_color,\n                                    bg_image: option_color.bg_image_url\n                                };\n                                if( origin_field.general.attributes.bg_type == 'i' ){\n                                    options_str += ( ( options_str == '' ) ? '' : '|' ) + 'color,' + field_id + ',' + field.value;\n                                }\n                                if( angular.isDefined( origin_field.general.attributes.show_as_pt ) && origin_field.general.attributes.show_as_pt == 'y' ){\n                                    nbOption.extraOdOption.pattern = {\n                                        bg_image: option_color.bg_image_url,\n                                        color: option_color.bg_color,\n                                        type: origin_field.general.attributes.bg_type\n                                    };\n                                    delete nbOption.odOption.color;\n                                }\n                                break;\n                            case 'page':\n                            case 'page1':\n                            case 'page2':\n                                var number_page = $scope.validate_int( field.value );\n                                nbOption.odOption.page = {\n                                    number: number_page,\n                                    page_display: origin_field.general.page_display,\n                                    exclude_page: origin_field.general.exclude_page,\n                                    field_id: field_id\n                                };\n                                if( origin_field.general.data_type == 'm' ){\n                                    nbOption.odOption.page.list_page = field.values;\n                                }\n                                break;\n                            case 'page3':\n                                var list_page = [0, 1];\n                                if( field.value == 0 ){\n                                    list_page = [0];\n                                } else if ( field.value == 1 ){\n                                    list_page = [1];\n                                }\n                                nbOption.odOption.page = {\n                                    list_page: list_page,\n                                    field_id: field_id\n                                };\n                                break;\n                            case 'size':\n                                \/*var currentFieldIndex = $scope.getFieldIndexById(field_id) + '';\n                                if( $scope.options.bulk_fields.includes(currentFieldIndex) ){\n                                    nbOption.variations = [];\n                                    var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n                                    angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][field_id][bf_index]];\n                                        var first = true, name = '';\n                                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                                            var _origin_field = $scope.get_field(_bff_id);\n                                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                                            var separate = first ? '' : ', ';\n                                            name += separate + _option.name;\n                                            first = false;\n                                        });\n                                        var size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                                    });\n                                }else{*\/\n                                    if(origin_field.general.attributes.same_size == 'n'){\n                                        var option_size = origin_field.general.attributes.options[field.value];\n                                        nbOption.odOption.size = {\n                                            product_width: $scope.validate_float( option_size.product_width ),\n                                            product_height: $scope.validate_float( option_size.product_height ),\n                                            real_width: $scope.validate_float( option_size.real_width ),\n                                            real_height: $scope.validate_float( option_size.real_height ),\n                                            real_top: $scope.validate_float( option_size.real_top ),\n                                            real_left: $scope.validate_float( option_size.real_left )\n                                        };\n                                    }\n                                \/*}*\/\n                                break;\n                            case 'dimension':\n                                nbOption.odOption.dimension = {\n                                    width: field.width,\n                                    height: field.height\n                                };\n                                break;\n                            case 'orientation':\n                                nbOption.odOption.orientation = $scope.validate_int( field.value );\n                                break;\n                            case 'area':\n                                nbOption.odOption.area = $scope.validate_int( parseInt(field.value) + 1 );\n                                break;\n                            case 'padding':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.odOption.padding = parseFloat(option.padding);\n                                break;\n                            case 'rounded_corner':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.rounded_corner = parseFloat(option.radius);\n                                break;\n                            case 'overlay':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.overlay = option.overlay_image_url;\n                                break;\n                            case 'fold':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.fold = option.fold;\n                                break;\n                            case 'shape':\n                                var option = origin_field.general.attributes.options[field.value];\n                                nbOption.extraOdOption.shape = option.shape;\n                                break;\n                        }\n                    }\n                }\n            });\n            if( nbOption.enable_gallery_api == '1' && options_str != '' ){\n                nbOption.prev_options_str = nbOption.options_str;\n                nbOption.options_str = options_str;\n                var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n                _options_folder = window.btoa( _options_folder );\n                $timeout(function(){\n                    if( nbOption.prev_options_str != nbOption.options_str ) $scope.get_gallery( _options_folder );\n                });\n            }\n            \/* send option to editor *\/\n            if( angular.equals( nbOption.odOption, nbOption.lastOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_options_without_od_option' );\n            }else{\n                jQuery(document).triggerHandler( 'change_nbo_options_with_od_option' );\n            };\n            if( !angular.equals( nbOption.extraOdOption, nbOption.lastExtraOdOption ) ){\n                jQuery(document).triggerHandler( 'change_nbo_extra_od_options' );\n            }\n            jQuery(document).triggerHandler( 'change_nbo_options' );\n        };\n                $scope.getFieldIndexById = function(field_id){\n            var currentFieldIndex = 0;\n            angular.forEach($scope.options.fields, function(__field, __index){\n                if(__field.id == field_id) currentFieldIndex = __index;\n            });\n            return currentFieldIndex;\n        };\n        $scope.updateVariations = function(){\n            nbOption.variations = [];\n            var bulkForm = jQuery('.nbo-bulk-variation input, .nbo-bulk-variation select').serializeJSON();\n            angular.forEach(bulkForm['nbb-qty-fields'], function(bf_field, bf_index){\n                angular.forEach(bulkForm['nbb-fields'], function(bff_field, bff_id){\n                    var origin_field = $scope.get_field(bff_id);\n                    if( origin_field.nbd_type == 'size' ){\n                        var first = true, name = '';\n                        angular.forEach(bulkForm['nbb-fields'], function(_bff_field, _bff_id){\n                            var _origin_field = $scope.get_field(_bff_id);\n                            var _option = _origin_field.general.attributes.options[bulkForm['nbb-fields'][_bff_id][bf_index]];\n                            var separate = first ? '' : ', ';\n                            name += separate + _option.name;\n                            first = false;\n                        });\n                        var option_size = origin_field.general.attributes.options[bulkForm['nbb-fields'][bff_id][bf_index]];\n                        var size = {\n                            product_width: $scope.validate_float( option_size.product_width ),\n                            product_height: $scope.validate_float( option_size.product_height ),\n                            real_width: $scope.validate_float( option_size.real_width ),\n                            real_height: $scope.validate_float( option_size.real_height ),\n                            real_top: $scope.validate_float( option_size.real_top ),\n                            real_left: $scope.validate_float( option_size.real_left )\n                        };\n                        nbOption.variations.push({index: bf_index, qty: $scope.validate_int(bf_field), size: size, name: name});\n                    }\n                });\n            });\n            if(nbOption.variations.length){\n                jQuery(document).triggerHandler( 'change_nbo_size_variations' );\n            }\n        };\n        $scope.updateMultiselectValue = function(field_id){\n            $scope.nbd_fields[field_id].values = [];\n            angular.forEach($scope.nbd_fields[field_id]._values, function(val, index){\n                if(val){\n                    $scope.nbd_fields[field_id].values.push(index);\n                }\n            });\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].values[0];\n            $scope.check_valid();\n        };\n        $scope.update_dimensionvalue = function(field_id, dir){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] );\n            current_val = ( current_val < min_val ) ? min_val : current_val;\n            current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.current_dimensions[dir] = current_val;\n            $scope.nbd_fields[field_id].value = $scope.nbd_fields[field_id].width + 'x' + $scope.nbd_fields[field_id].height;\n            $scope.check_valid();\n        };\n        $scope.update_dimension = function(field_id, dir, operator){\n            var origin_field = $scope.get_field(field_id),\n            current_val = $scope.validate_float( $scope.nbd_fields[field_id][dir] ),\n            min_val = $scope.validate_float( origin_field.general['min_' + dir] ),\n            max_val = $scope.validate_float( origin_field.general['max_' + dir] ),\n            step_val = $scope.validate_float( origin_field.general['step_' + dir] );\n            step_val = ( step_val == 0 ) ? 1 : step_val;\n            if( operator == 'minus' ){\n                current_val = (current_val - step_val) >= min_val ? $scope.shorten(current_val - step_val) : min_val;\n            }else{\n                if( max_val != 0 ){\n                    current_val = (current_val + step_val) <= max_val ? $scope.shorten(current_val + step_val) : max_val;\n                }\n            }\n            $scope.nbd_fields[field_id][dir] = current_val;\n            $scope.update_dimensionvalue( field_id, dir );\n        };\n        $scope.lastTickDpi = new Date().getTime();\n        $scope.update_dpi = function(){\n            $scope.lastTickDpi = new Date().getTime();\n            $timeout(function() {\n                var current = new Date().getTime();\n                if( (current - $scope.lastTickDpi) >= 500){\n                    $scope.check_valid();\n                };\n            }, 500);\n        };\n        $scope.set_product_image_attr = function(ele, attr, value, id){\n            if( angular.isUndefined($scope.product_image[id]) || angular.isUndefined($scope.product_image[id][attr]) ){\n                if( angular.isUndefined($scope.product_image[id]) ) $scope.product_image[id] = {};\n                $scope.product_image[id][attr] = ele.attr( attr );\n            }\n            if ( false === value ) {\n                ele.removeAttr( attr );\n            }else{\n                ele.attr( attr, value );\n            }\n        };\n        $scope.reset_product_image_attr = function(ele, attr, id){\n            ele.attr( attr, $scope.product_image[id][attr] );\n            delete $scope.product_image[id][attr];\n        };\n        $scope.may_be_change_product_image = function(){\n            $scope.product_img = [];\n            angular.forEach($scope.nbd_fields, function(_field, field_id){\n                var field = $scope.get_field(field_id);\n                if( field.general.data_type == 'm' && field.appearance.change_image_product == 'y' \n                    && field.general.attributes.options[_field.value].imagep == 'y' && _field.enable ){\n                    $scope.product_img.field_id  = field_id;\n                    $scope.product_img.option_index  = _field.value;\n                }\n            });\n            if( angular.isDefined($scope.product_img.field_id) && angular.isDefined($scope.product_img.option_index) ){\n                $scope.change_product_image($scope.product_img.field_id, $scope.product_img.option_index);\n            }\n        };\n        $scope.change_product_image = function( field_id, option_index ){\n            var field = $scope.get_field(field_id);\n            if( field.appearance.change_image_product == 'y' && field.general.attributes.options[option_index].imagep == 'y' ){\n                var product_element = jQuery( '#product-'+ $scope.product_id );\n                var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n                if ( product_image.length === 0 ) {\n                    product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n                }\n                if ( jQuery( product_image ).length > 1 ) {\n                    product_image = jQuery( product_image ).first();\n                }  \n                var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n                gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n                product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n                product_link = product_image.closest( 'a' );\n                var option_data = field.general.attributes.options[option_index];\n                if( !option_data.full_src ) option_data.full_src = option_data.image_link;\n                if (product_image.length){\n                    if( !option_data.full_src_w ) option_data.full_src = product_image.attr('data-large_image_width');\n                    if( !option_data.full_src_h ) option_data.full_src_h = product_image.attr('data-large_image_height');\n                    $scope.set_product_image_attr(product_image, 'src', option_data.image_link, 0);\n                    $scope.set_product_image_attr(product_image, 'srcset', option_data.image_srcset, 0);\n                    $scope.set_product_image_attr(product_image, 'sizes', option_data.image_sizes, 0);\n                    $scope.set_product_image_attr(product_image, 'title', option_data.image_title, 0);\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.image_alt, 0);\n                    $scope.set_product_image_attr(product_image, 'data-src', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image', option_data.full_src, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_width', option_data.full_src_w, 0);\n                    $scope.set_product_image_attr(product_image, 'data-large_image_height', option_data.full_src_h, 0);\n\n                    $scope.set_product_image_attr(product_image, 'alt', option_data.alt, 0);\n                    $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option_data.image_link, 1);\n                }\n                if (gallery_image.length){\n                    $scope.set_product_image_attr(gallery_image, 'src', option_data.image_link, 2);\n                }\n                if (product_link.length){\n                    $scope.set_product_image_attr(product_link, 'href', option_data.full_src, 3);\n                    $scope.set_product_image_attr(product_link, 'title', option_data.image_caption, 3);\n                }\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_gallery_image = function( gallery_images, folder ){\n            if( angular.isDefined( folder ) ){\n                nbOption.template_folder = folder;\n                nbOption.gallery = {};\n                nbOption.design_stored = 1;\n            }\n            var _options_folder = 'product_id,' + $scope.product_id + '|' + 'template,' + nbOption.template_folder + '|' + nbOption.options_str;\n            _options_folder = window.btoa( _options_folder );\n            nbOption.gallery[_options_folder] = gallery_images;\n            var product_element = jQuery( '#product-'+ $scope.product_id ),\n            product_images = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ),\n            thumbnail_images = product_element.find( '.flex-control-nav li' );\n            if(product_images.length > 1 && gallery_images.length > 0 ){\n                jQuery.each( product_images, function( index, el ){\n                    if( index > 0 && index <= gallery_images.length ){\n                        var timestamp = new Date().getTime(),\n                        src = gallery_images[index - 1].src + '?t=' + timestamp;\n                        jQuery(el).find('a img').attr({\n                            'src': src,\n                            'srcset': src + ' 320w',\n                            'sizes': gallery_images[index - 1].sizes,\n                            'title': gallery_images[index - 1].title,\n                            'data-src': src,\n                            'data-large_image': src,\n                            'data-large_image_width': gallery_images[index - 1].width,\n                            'data-large_image_height': gallery_images[index - 1].height,\n                            'data-thumb': src\n                        });\n                        jQuery(el).find('a').attr( 'href', src );\n                        jQuery(el).addClass('nbo-gallery-loading');\n                        thumbnail_images.eq(index).addClass('nbo-gallery-loading');\n                        var image = new Image();\n                        image.onload = function(){\n                            thumbnail_images.eq(index).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                            thumbnail_images.eq(index).removeClass('nbo-gallery-loading');\n                            jQuery(el).removeClass('nbo-gallery-loading');\n                            jQuery('#nbdesigner_frontend_area .img-con').eq(index - 1).find('img').attr( { 'src': src, 'alt': gallery_images[index - 1].title } );\n                        };\n                        image.src = src;\n                    }\n                });\n                $scope.init_product_gallery_and_zoom();\n            }\n        };\n        $scope.change_product_image_without_field = function( option ){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var product_image = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first();\n            if ( product_image.length === 0 ) {\n                product_image = product_element.find( \"a.woocommerce-main-image img, img.woocommerce-main-image,a img\" ).not( '.thumbnails img,.product_list_widget img' ).first();\n            }\n            if ( jQuery( product_image ).length > 1 ) {\n                product_image = jQuery( product_image ).first();\n            }\n            var gallery_image = product_element.find( '.flex-control-nav li:eq(0) img' ),\n            gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ),\n            product_image_wrap = gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ),\n            product_link = product_image.closest( 'a' );\n            if (product_image.length){\n                $scope.set_product_image_attr(product_image, 'src', option.image_link, 0);\n                $scope.set_product_image_attr(product_image, 'srcset', option.image_srcset, 0);\n                $scope.set_product_image_attr(product_image, 'sizes', option.image_sizes, 0);\n                $scope.set_product_image_attr(product_image, 'title', option.image_title, 0);\n                $scope.set_product_image_attr(product_image, 'alt', option.image_alt, 0);\n                $scope.set_product_image_attr(product_image, 'data-src', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image', option.full_src, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_width', option.full_src_w, 0);\n                $scope.set_product_image_attr(product_image, 'data-large_image_height', option.full_src_h, 0);\n\n                $scope.set_product_image_attr(product_image, 'alt', option.alt, 0);\n                $scope.set_product_image_attr(product_image_wrap, 'data-thumb', option.image_link, 1);\n            }\n            if (gallery_image.length){\n                $scope.set_product_image_attr(gallery_image, 'src', option.image_link, 2);\n            }\n            if (product_link.length){\n                $scope.set_product_image_attr(product_link, 'href', option.full_src, 3);\n                $scope.set_product_image_attr(product_link, 'title', option.image_caption, 3);\n            }\n            $scope.init_product_gallery_and_zoom();\n        };\n        $scope.init_product_gallery_and_zoom = function(){\n            var product_element = jQuery( '#product-'+ $scope.product_id );\n            var gallery_element = product_element.find( '.woocommerce-product-gallery' );\n            if( gallery_element.length && gallery_element.data( 'flexslider' ) ){\n                $timeout(function(){\n                    gallery_element.flexslider( 0 );\n                }, 100);\n                window.setTimeout( function () {\n                    gallery_element.trigger( 'woocommerce_gallery_init_zoom' );\n                    jQuery( window ).trigger( 'resize' );\n                }, 10 );\n            }\n            var zoom_images = product_element.find( '.woocommerce-product-gallery__image' ),\n                galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(),\n                zoomEnabled  = false;\n            jQuery( zoom_images ).each( function( index, target ) {\n                var image = jQuery( target ).find( 'img.wp-post-image' );\n                if ( image.attr( 'data-large_image_width' ) > galleryWidth ) {\n                    zoomEnabled = true;\n                    return false;\n                }\n            } ); \n            if ( zoomEnabled ){\n                var zoom_options = {\n                    touch: false\n                };\n                if ( 'ontouchstart' in window ) {\n                    zoom_options.on = 'click';\n                }\n                zoom_images.trigger( 'zoom.destroy' );\n                if( typeof zoom_images.zoom == 'function' ) zoom_images.zoom( zoom_options );\n            }else{\n                zoom_images.trigger( 'zoom.destroy' );\n            }\n        };\n        $scope.debug = function(){\n            jQuery('input[name=\"quantity\"]').val( 100 );\n            jQuery('input[name=\"quantity\"]').trigger( 'change.nbo' );\n        };\n        $scope.get_field = function( field_id ){\n            var _field = null;\n            angular.forEach( $scope.fields, function( field ){\n                if( field.id == field_id ) _field = field;\n            });\n            return _field;\n        };\n        $scope.get_field_index = function( field_id ){\n            var _index = null;\n            angular.forEach( $scope.fields, function( field, index ){\n                if( field.id == field_id ) _index = index;\n            });\n            return _index;\n        };\n        $scope.check_depend = function( field_id ){\n            if( angular.isUndefined($scope.nbd_fields[field_id]) ) return;\n            var field = $scope.get_field(field_id),\n            check = [];\n            $scope.nbd_fields[field_id].enable = true;\n            if( field.conditional.enable == 'n' ) return true;\n            if( angular.isUndefined(field.conditional.depend) ) return true;\n            if( field.conditional.depend.length == 0 ) return true;\n            var show = field.conditional.show,\n            logic = field.conditional.logic,\n            total_check = logic == 'a' ? true : false;\n            angular.forEach(field.conditional.depend, function(con, key){\n                if( con.id != '' ){\n                    if( con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                        check[key] = false;\n                    }else{\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                break; \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }\n                }else{\n                    check[key] = true;\n                }\n            });\n            angular.forEach(check, function(c){\n                total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n            });\n            $scope.nbd_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            return $scope.nbd_fields[field_id].enable;\n        };\n        $scope.checkAttributeStatus = function( field_id, attr_index, sub_attr_index ){\n            var check = true, checks = [];\n            var origin_field = $scope.get_field(field_id),\n            currentOption = origin_field.general.attributes.options[attr_index], \n            option;\n            $scope.status_fields[field_id][attr_index] = $scope.status_fields[field_id][attr_index] || {\n                sub_attributes: [],\n                enable: true\n            };\n\n            function assignCheck( check ){\n                if( typeof sub_attr_index != 'undefined' ){\n                    $scope.status_fields[field_id][attr_index].sub_attributes = $scope.status_fields[field_id][attr_index].sub_attributes || [];\n                    $scope.status_fields[field_id][attr_index].sub_attributes[sub_attr_index] = check;\n                }else{\n                    $scope.status_fields[field_id][attr_index].enable = check;\n                }\n            }\n\n            if( typeof sub_attr_index != 'undefined' ){\n                option = currentOption.sub_attributes[sub_attr_index];\n            }else{\n                option = currentOption;\n            }\n\n            if( angular.isDefined( option.enable_con ) && option.enable_con == 'on' && angular.isDefined( option.depend ) ){\n                if( option.depend.length > 0 ){\n                    var show = option.con_show,\n                    logic = option.con_logic,\n                    total_check = logic == 'a' ? true : false;\n                    angular.forEach(option.depend, function(con, key){\n                        if( con.id != '' ){\n                            if(  con.id != 'qty' && ( angular.isUndefined($scope.nbd_fields[con.id]) || !$scope.nbd_fields[con.id].enable ) ){\n                                checks[key] = false;\n                            }else{\n                                if( con.id == 'qty' ){\n                                    var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                                    if( $scope.is_sold_individually == 1 ){\n                                        qty = 1;\n                                    }\n                                    con.val = con.val * 1;\n                                }\n                                switch(con.operator){\n                                    case 'i':\n                                        checks[key] = $scope.nbd_fields[con.id].value == con.val ? true : false;\n                                        break;\n                                    case 'n':\n                                        checks[key] = $scope.nbd_fields[con.id].value != con.val ? true : false;\n                                        break;  \n                                    case 'e':\n                                        checks[key] = $scope.nbd_fields[con.id].value == '' ? true : false;\n                                        break;\n                                    case 'ne':\n                                        checks[key] = $scope.nbd_fields[con.id].value != '' ? true : false;\n                                        break;\n                                    case 'eq':\n                                        checks[key] = qty == con.val ? true : false;\n                                        break;\n                                    case 'gt':\n                                        checks[key] = qty > con.val ? true : false;\n                                        break;\n                                    case 'lt':\n                                        checks[key] = qty < con.val ? true : false;\n                                        break;\n                                }\n                            }\n                            if( angular.isDefined( con.subval ) && con.subval != '' ){\n                                if( angular.isUndefined( $scope.nbd_fields[con.id] ) || !$scope.nbd_fields[con.id].enable || angular.isUndefined( $scope.nbd_fields[con.id].sub_value ) ){\n                                    checks[key] = false;\n                                }else{\n                                    switch(con.operator){\n                                        case 'i':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value == con.val && $scope.nbd_fields[con.id].sub_value == con.subval ) ? true : false;\n                                            break;\n                                        case 'n':\n                                            checks[key] = ( $scope.nbd_fields[con.id].value != con.val || $scope.nbd_fields[con.id].sub_value != con.subval ) ? true : false;\n                                            break;\n                                    }\n                                }\n                            }\n                        }else{\n                            checks[key] = true;\n                        }\n                    });\n                    angular.forEach(checks, function(c){\n                        total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                    });\n                    check = show == 'y' ? total_check : !total_check;\n                }\n            }\n            assignCheck( check );\n        };\n        $scope.init = function(){\n            $scope.current_dimensions = {};\n            nbOption.status = true; \n                                                $scope.nbd_fields = {};\n            $scope.status_fields = {};\n            $scope.basePrice = $scope.convert_wc_price_to_float( $scope.price );\n            $scope.total_price = 0;\n            angular.forEach($scope.fields, function(field){\n                if(field.general.enabled == 'y'){\n                    $scope.nbd_fields[field.id] = {\n                        title: field.general.title,\n                        price: $scope.convert_to_wc_price(0),\n                        required: field.general.required\n                    };\n                    if(field.general.data_type == 'i'){\n                        if( field.general.input_type != 't' && field.general.input_type != 'a' ){\n                            if( field.general.input_type != 'u' ){\n                                if( angular.isDefined( field.general.input_option.default ) ){\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.default != '' ? field.general.input_option.default :  0;\n                                }else{\n                                    $scope.nbd_fields[field.id].value = field.general.input_option.min != '' ? field.general.input_option.min :  0;\n                                }\n                            }\n                        }else{\n                            $scope.nbd_fields[field.id].value = '';\n                            if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'dimension' ){\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' ){\n                                    $scope.nbd_fields[field.id].width = 1 * field.general.default_width;\n                                }\n                                if( angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].height = 1 * field.general.default_height;\n                                }\n                                if( angular.isDefined( field.general.default_width ) && field.general.default_width != '' \n                                        && angular.isDefined( field.general.default_height ) && field.general.default_height != '' ){\n                                    $scope.nbd_fields[field.id].value = $scope.nbd_fields[field.id].width + 'x' + $scope.nbd_fields[field.id].height;\n                                }\n                            }\n                        }\n                    }else{\n                        if( field.general.attributes.options.length == 0 ){\n                            $scope.nbd_fields[field.id].value = '0';\n                        }else{\n                            $scope.nbd_fields[field.id].value = '0';\n                            var selectedOp;\n                            $scope.status_fields[field.id] = [];\n                            angular.forEach(field.general.attributes.options, function(op, k){\n                                if( op.selected == 'on' ){\n                                    $scope.nbd_fields[field.id].value = '' + k;\n                                    selectedOp = op;\n                                }\n                                op.form_name = '';\n                                if( angular.isDefined(op.enable_subattr) && op.enable_subattr == 'on' ){\n                                    if(angular.isDefined(op.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        if( op.sub_attributes.length > 0 ) op.form_name = '[value]';\n                                    }\n                                }\n                                $scope.status_fields[field.id][k] = {enable: true};\n                            });\n                            if( !selectedOp ){\n                                selectedOp = field.general.attributes.options[0];\n                            }\n                            if( selectedOp ){\n                                if( angular.isDefined(selectedOp.enable_subattr) && selectedOp.enable_subattr == 'on' ){\n                                    if(angular.isDefined(selectedOp.sub_attributes)){\n                                        $scope.nbd_fields[field.id].sub_value = '0';\n                                        angular.forEach(selectedOp.sub_attributes, function(sop, sk){\n                                            if( sop.selected == 'on' ) $scope.nbd_fields[field.id].sub_value = '' + sk;\n                                        });\n                                    }\n                                } \n                            }\n                            if( $scope.isMultipleSelectPage( field ) ){\n                                if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                    $scope.nbd_fields[field.id].values = [parseInt($scope.nbd_fields[field.id].value)];\n                                }else{\n                                    $scope.nbd_fields[field.id].values = [];\n                                }\n                                $scope.nbd_fields[field.id]._values = [];\n                                angular.forEach(field.general.attributes.options, function(op, k){\n                                    if( angular.isDefined( $scope.form_values[field.id] ) ){\n                                        $scope.nbd_fields[field.id]._values[k] = false;\n                                    }else{\n                                        if( angular.isDefined( field.general.auto_select_page ) && field.general.auto_select_page == 'n' ){\n                                            if( op.selected == 'on' ){\n                                                $scope.nbd_fields[field.id]._values[k] = true;\n                                                $scope.nbd_fields[field.id].values.push(k);\n                                            }\n                                        }else{\n                                            $scope.nbd_fields[field.id]._values[k] = true;\n                                            $scope.nbd_fields[field.id].values.push(k);\n                                        }\n                                    }\n                                    \/\/$scope.nbd_fields[field.id]._values[k] = k == 0 ? true : false;\n                                });\n                                if( $scope.nbd_fields[field.id]._values.length == 0 ){\n                                    $scope.nbd_fields[field.id]._values[0] = true;\n                                    $scope.nbd_fields[field.id].values.push(0);\n                                }\n                            }\n                            if( $scope.artwork_action != '' ){\n                                if( angular.isDefined( field.nbe_type ) && field.nbe_type == 'actions' ){\n                                    $scope.nbd_fields[field.id].value = $scope.artwork_action;\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n            angular.forEach($scope.form_values, function(value, field_id){\n                if(field_id){\n                    if( angular.isDefined(value['sub_value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                        $scope.nbd_fields[field_id].sub_value = value['sub_value'];\n                    } else if( angular.isDefined(value['value']) ){\n                        $scope.nbd_fields[field_id].value = value['value'];\n                    }else{\n                        $scope.nbd_fields[field_id].value = value;\n                    }\n                }\n                var origin_field = $scope.get_field(field_id);\n                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' ){\n                    var dimension = value.split(\"x\");\n                    $scope.nbd_fields[field_id].width = parseFloat(dimension[0]);\n                    $scope.nbd_fields[field_id].height = parseFloat(dimension[1]);\n                }\n                if( $scope.isMultipleSelectPage( origin_field ) ){\n                    $scope.nbd_fields[field_id].value = value[0];\n                    $scope.nbd_fields[field_id].values = value;\n                    angular.forEach(value, function(val){\n                        $scope.nbd_fields[origin_field.id]._values[val] = true;\n                    });\n                }\n            });\n            angular.forEach($scope.fields, function(field){\n                $scope.check_depend(field.id);\n            });\n            if( $scope.options.display_type == 2 && ( ( $scope.options.pm_hoz.length > 0 || $scope.options.pm_ver.length > 0 ) || ( $scope.options.mpm_hoz.length > 0 && $scope.options.mpm_ver.length > 0 ) ) ){\n                $scope.init_price_matrix();\n                $scope.has_price_matrix = true;\n            }\n            if( nbOption.has_delivery ) $scope.init_turnaround_matrix();\n            $scope.check_valid();\n            $timeout(function(){\n                jQuery('.nbd-option-field:first').removeClass('nbo-collapse');\n\n                if( angular.isDefined( $scope.no_of_group ) && $scope.no_of_group != 0 ){\n                    $scope.changeGroupPanel( null, 0 );\n                    $scope.initGroupTimeline();\n                }\n            });\n            jQuery(document).on( 'change_nbo_variations', function(){\n                $scope.upDateVaritionQty(NBDESIGNERPRODUCT.variations);\n            });\n        };\n        $scope.mapOptions = function(){\n            if( !$scope.variations_form ){\n                $scope.variations_form = jQuery('.variations_form');\n                $scope.variations_form_obj = {\n                    calculator: null,\n                    use_ajax: false,\n                    swatches_xhr: null,\n                    checked: false,\n                    first: true\n                };\n                if( $scope.variations_form.length && $scope.variations_form.find('select.nbo-mapping-select').length ){\n                    var getSelector = function( field_id ){\n                        var field = $scope.get_field(field_id),\n                        type = field.appearance.display_type,\n                        selector = '';\n                        if( angular.isDefined( field.nbd_type ) && field.nbd_type == 'shape' ){\n                            type = 'ad';\n                        }\n                        switch( type ){\n                            case 's':\n                                selector = '> .nbd-swatch-wrap input[type=\"radio\"]';\n                                break;\n                            case 'r':\n                                selector = '> .__nbd-radio-wrap input[type=\"radio\"]';\n                                break;\n                            case 'xl':\n                                selector = '> .nbd-xlabel-wrapper input[type=\"radio\"]';\n                                break;\n                            case 'ad':\n                                selector = '> div > select option';\n                                break;\n                            case 'l':\n                                selector = '> .nbd-label-wrap input[type=\"radio\"]';\n                                break;\n                            default:\n                                selector = '> .__nbd-dropdown-wrap select option';\n                                break;\n                        }\n                        return selector;\n                    };\n\n                    var updateFieldStatus = function( current_options ){\n                        var mustCheckValid = false;\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name'),\n                            avaiable_options = current_options[attribute_name];\n\n                            jQuery(this).find('option').each(function(index, el){\n                                var val = jQuery(el).val();\n                                if( index > 0 ){\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                    if ( !avaiable_options[val] ) {\n                                        option.addClass('nbo_map_disable').attr('disabled', 'disabled');\n                                    }else{\n                                        option.removeClass('nbo_map_disable').removeAttr('disabled');\n                                    }\n                                }\n                            });\n                        });\n                        if( mustCheckValid ){\n                            \/\/$scope.check_valid();\n                        }\n                    };\n\n                    var init = function(){\n                        $scope.variations_form.find('.variations select.nbo-mapping-select').each(function () {\n                            var classList = jQuery(this).attr('class').split(\/\\s+\/),\n                            val = jQuery(this).val(),\n                            field_id, optionWrap;\n                            jQuery.each(classList, function(index, _class) {\n                                if ( _class.indexOf(\"nbo_field_id-\") > -1 ) {\n                                    var arr = _class.split(\"-\");\n                                    field_id = arr[1];\n                                }\n                            });\n                            optionWrap = jQuery('.nbd-option-field[data-id=\"' + field_id + '\"]');\n                            var selector = getSelector( field_id );\n                            if( optionWrap.length ){\n                                jQuery(this).parents('tr').hide();\n                                if( val != '' ){\n                                    var index = jQuery(this).find(\"[value='\" + val + \"']\").index();\n                                    var option = optionWrap.find('.nbd-field-content ' + selector).eq( index - 1);\n                                }else{\n                                    option = optionWrap.find('.nbd-field-content ' + selector).eq(0);\n                                }\n                                if( option.attr('disabled') == 'disabled'){\n                                    var enabledOption = optionWrap.find('.nbd-field-content ' + selector +':enabled').eq(0);\n                                    if( enabledOption.length ){\n                                        enabledIndex = enabledOption.val();\n                                        $scope.nbd_fields[field_id].value = enabledIndex;\n                                        $scope.updateMapOptions(field_id);\n                                    }\n                                }\n                            }else{\n                                jQuery(this).show();\n                            }\n                        });\n                        $scope.check_valid();\n                        $scope.variations_form_obj.first = false;\n                    };\n\n                    $scope.variations_form.on('bind_calculator', function(){\n                        var $product_variations = $scope.variations_form.data('product_variations');\n                        $scope.variations_form_obj.use_ajax = $product_variations === false;\n\n                        if ( $scope.variations_form_obj.use_ajax && jQuery.fn.block ) {\n                            $scope.variations_form.block({message: null, overlayCSS: {background: '#fff', opacity: 0.6}});\n                        }\n\n                        var attribute_keys = {};\n                        $scope.variations_form.find('.variations select').each(function (index, el) {\n                            var $current_attr_select = jQuery(el);\n                            var current_attribute_name = $current_attr_select.data('attribute_name') || $current_attr_select.attr('name');\n                            attribute_keys[current_attribute_name] = [];\n                            var current_options = '';\n                            current_options = $current_attr_select.find('option:gt(0)').get();\n                            if (current_options.length) {\n                                for (var i = 0; i < current_options.length; i++) {\n                                    var option = current_options[i];\n                                    attribute_keys[current_attribute_name].push(jQuery(option).val());\n                                }\n                            }\n                        });\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            if ( $scope.variations_form_obj.swatches_xhr ) {\n                                $scope.variations_form_obj.swatches_xhr.abort();\n                            }\n\n                            var data = {\n                                product_id: $scope.product_id,\n                                action: 'nbo_get_product_variations'\n                            };\n\n                            $scope.variations_form_obj.swatches_xhr = jQuery.ajax({\n                                url: $scope.ajax_url,\n                                type: 'POST',\n                                data: data,\n                                success: function (response) {\n                                    $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, response.data, null, null);\n                                    if( jQuery.fn.unblock ) {\n                                        $scope.variations_form.unblock();\n                                    }\n\n                                    $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                                    if( $scope.variations_form_obj.first ){\n                                        init();\n                                    }\n                                }\n                            });\n                        } else {\n                            $scope.variations_form_obj.calculator = new nbo_variation_calculator(attribute_keys, $product_variations, null, null);\n                        }\n\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n\n                        if ( !$scope.variations_form_obj.use_ajax ) {\n                            if( $scope.variations_form_obj.first ){\n                                init();\n                            }\n                        }\n                    });\n\n                    $scope.variations_form.on('reset_data', function(){\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        if( !$scope.variations_form_obj.checked ){\n                            updateFieldStatus( current_options );\n                            $scope.variations_form_obj.checked = true;\n                        }\n                    })\n                    .on('woocommerce_variation_has_changed', function () {\n                        if ( $scope.variations_form_obj.calculator == null ) {\n                            return;\n                        }\n\n                        $scope.variations_form.find('.variations select').each(function () {\n                            var attribute_name = jQuery(this).data('attribute_name') || jQuery(this).attr('name');\n                            $scope.variations_form_obj.calculator.set_selected(attribute_name, jQuery(this).val());\n                        });\n\n                        var current_options = $scope.variations_form_obj.calculator.get_current();\n                        updateFieldStatus( current_options );\n\n                        if ( $scope.variations_form_obj.use_ajax ) {\n                            $scope.variations_form.find('.nbo-default-select').each(function (index, element) {\n                                var $wc_select_box = jQuery(element);\n\n                                var attribute_name = $wc_select_box.data('attribute_name') || $wc_select_box.attr('name');\n                                var avaiable_options = current_options[attribute_name];\n\n                                $wc_select_box.find('option:gt(0)').removeClass('attached');\n                                $wc_select_box.find('option:gt(0)').removeClass('enabled');\n                                $wc_select_box.find('option:gt(0)').removeAttr('disabled');\n\n                                $wc_select_box.find('option:gt(0)').each(function (optindex, option_element) {\n                                    if (!avaiable_options[jQuery(option_element).val()]) {\n                                        jQuery(option_element).addClass('disabled', 'disabled');\n                                    } else {\n                                        jQuery(option_element).addClass('attached');\n                                        jQuery(option_element).addClass('enabled');\n                                    }\n                                });\n\n                                $wc_select_box.find('option:gt(0):not(.enabled)').attr('disabled', 'disabled');\n                            });\n                        }\n                    });\n\n                    $scope.variations_form.trigger('bind_calculator');\n                    $scope.variations_form.on('reload_product_variations', function () {\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                        $scope.variations_form.trigger('bind_calculator');\n                        $scope.variations_form.trigger('woocommerce_variation_has_changed');\n                    });\n\n                    $scope.variations_form.trigger('check_variations');\n                }\n            }\n        };\n        $scope.updateMapOptions = function( field_id ){\n            if( !$scope.variations_form ) return;\n            $timeout(function(){\n                var _class = \"nbo_field_id-\" + field_id,\n                index = parseInt( $scope.nbd_fields[field_id].value );\n                if( $scope.variations_form.find( 'select.' + _class ).length ){\n                    $scope.variations_form.find( 'select.' + _class ).find('option').eq( index + 1 ).prop(\"selected\", \"selected\").change();\n                }\n            });\n        };\n        $scope.upDateVaritionQty = function( variations ){\n            jQuery.each(jQuery('.nbb-qty-field'), function(index, ip){\n                jQuery(ip).val(variations[index].qty);\n            });\n        };\n        $scope.reset_options = function(){\n                        $scope.init();\n                        if( angular.isDefined( $scope.quantity ) ) $scope.change_quantity();\n            jQuery(document).triggerHandler( 'reset_nbo_options' );\n        };\n        $scope.update_turnaround_matrix = function(){\n            var need_update_quantity_break = true;\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                if( _break.val == $scope.quantity ) need_update_quantity_break = false;\n            });\n            if( need_update_quantity_break ){\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n                var quantity_break  = $scope.get_quantity_break( $scope.quantity );\n                var quantity_break_clone = {};\n                angular.copy($scope.options.quantity_breaks[quantity_break.index], quantity_break_clone);\n                quantity_break_clone.val = $scope.quantity;\n                var position = quantity_break.oparator == 'lt' ? quantity_break.index : quantity_break.index + 1;\n                $scope.turnaround_quantity_breaks.splice(position, 0, quantity_break_clone);\n                $scope.init_turnaround_matrix( true );\n                $scope.calc_turnaround_matrix();\n                if( $scope.current_turnaround_position[0] != 0 ){\n                    if( $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].show == false ){\n                        var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                        for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                            if( $scope.turnaround_matrix[position][ i ].show == true ){\n                                $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                                $scope.current_turnaround_position[1] = i;\n                                $scope.current_turnaround_position[0] = position;\n                                $scope.check_valid();\n                                $scope.turnaround_matrix[position][ i ].active = true;\n                                break;\n                            }\n                        }\n                    }else{\n                        $scope.turnaround_matrix[position][ $scope.current_turnaround_position[1] ].active = true;\n                        $scope.current_turnaround_position[0] = position;\n                    }\n                }\n                $scope.change_quantity();\n            }\n        };\n        $scope.init_turnaround_matrix = function( update_qty_breaks ){\n            $scope.turnaround_matrix = [];\n            if( angular.isUndefined( update_qty_breaks ) ){\n                $scope.current_turnaround_position = [0, 0];\n                $scope.turnaround_quantity_breaks = [];\n                angular.copy($scope.options.quantity_breaks, $scope.turnaround_quantity_breaks);\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                $scope.turnaround_matrix[key] = [];\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var active = false;\n                    if( angular.isUndefined( update_qty_breaks ) && angular.isDefined( $scope.form_values[ nbOption.delivery_field_id ] ) \n                            && $scope.form_values[ nbOption.delivery_field_id ] == okey && $scope._quantity == _break.val ){\n                        active = true;\n                    }\n                    $scope.turnaround_matrix[key][okey] = {\n                        qty: $scope.validate_int( _break.val ),\n                        show: false,\n                        active: active\n                    };\n                });\n            });\n        };\n        $scope.change_delivery_date = function( qty_break_index, delivery_index ){\n            $scope.quantity = $scope.validate_int( $scope.turnaround_quantity_breaks[ qty_break_index ].val );\n            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + delivery_index;\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    $scope.turnaround_matrix[key][okey].active = false;\n                });\n            });\n            $scope.turnaround_matrix[qty_break_index][delivery_index].active = true;\n            $scope.custom_quantity = false;\n            $scope.current_turnaround_position = [qty_break_index, delivery_index];\n            $scope.change_quantity();\n        };\n        $scope.update_delivery_date = function(){\n            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val()),\n                quantity_break  = $scope.get_quantity_break( qty ),\n                position = quantity_break.index;\n            if( angular.isDefined( $scope.current_turnaround_position[1] ) ){\n                if( $scope.turnaround_matrix[ position ][ $scope.current_turnaround_position[1] ].show == false ){\n                    $scope.turnaround_matrix[ $scope.current_turnaround_position[0] ][ $scope.current_turnaround_position[1] ].active = false;\n                    var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n                    for (i = 0; i < delivery_field.general.attributes.options.length; i++) {\n                        if( $scope.turnaround_matrix[position][ i ].show == true ){\n                            $scope.nbd_fields[nbOption.delivery_field_id].value = '' + i;\n                            $scope.current_turnaround_position[1] = i;\n                            $scope.current_turnaround_position[0] = position;\n                            $scope.turnaround_matrix[position][ i ].active = true;\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.custom_qty = {\n            enable: false,\n            value: !!$scope.quantity ? $scope.quantity : 1\n        };\n        var debounce_change_quantity = _debounce(function(event){\n            $scope.quantity = $scope.custom_qty.value;\n            $scope.change_quantity();\n        } , 300);\n        $scope._change_quantity = function(){\n            debounce_change_quantity();\n        };\n        $scope.disable_custom_qty = function(){\n            $timeout(function(){\n                $scope.custom_qty = {\n                    enable: false,\n                    value: $scope.quantity\n                };\n            });\n        };\n        $scope.change_quantity = function(){\n            $timeout(function(){\n                jQuery('input[name=\"quantity\"]').val($scope.quantity).trigger( 'change.nbo' );\n            });\n        };\n        $scope.select_all_variation = function( $event ){\n            var el = angular.element($event.target),\n            list = el.parents('table.nbo-bulk-variation').find('tbody input.nbo-bulk-checkbox'),\n            check = el.prop('checked') ? true : false;\n            jQuery.each(list, function(){\n                jQuery(this).prop('checked', check);\n            });\n        };\n        $scope.add_variaion = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody'),\n            row = tb.find('tr').last().clone();\n            tb.append(row);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.delete_variaions = function( $event ){\n            var el = angular.element($event.target),\n            tb = el.parents('table.nbo-bulk-variation').find('tbody');\n            jQuery.each(tb.find('input.nbo-bulk-checkbox:checked'), function(){\n                if( tb.find('tr').length > 1 ) jQuery(this).parents('tr').remove();\n            });\n            el.parents('table.nbo-bulk-variation').find('input.nbo-bulk-checkbox').prop('checked', false);\n            $scope.calculate_bulk_total_price();\n        };\n        $scope.init_price_matrix = function(){\n            $scope.options.pm_num_col = 1;\n            $scope.options.pm_num_row = 1;\n            $scope.options.pm_hoz_field = [];\n            $scope.options.pm_ver_field = [];\n            $scope.options.pm_hoz.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_col *= $scope.fields[field_index].general.attributes.options.length;\n                var colspan = 1;\n                $scope.options.pm_hoz.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) colspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_hoz_field.push({field_id: $scope.fields[field_index].id, colspan: colspan});\n            });\n            $scope.options.pm_ver.forEach(function(field, index){\n                var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                $scope.options.pm_num_row *= $scope.fields[field_index].general.attributes.options.length;\n                var rowspan = 1;\n                $scope.options.pm_ver.forEach(function(field, _index){\n                    var field_index = $scope.options.matrix_type == 1 ? field : $scope.get_field_index( field );\n                    if(_index > index) rowspan *= $scope.fields[field_index].general.attributes.options.length;\n                });\n                $scope.options.pm_ver_field.push({field_id: $scope.fields[field_index].id, rowspan: rowspan});\n            });\n            var i, j;\n            $scope.options.price_matrix = [];\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                $scope.options.price_matrix[i] = [];\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    var h_index = j;\n                    $scope.options.price_matrix[i][j] = {\n                        fields: {},\n                        pm_fields: {},\n                        discount_by_qty: 0,\n                        total_price: 0,\n                        class: '',\n                        price: '?',\n                        disable: false\n                    };\n                    $scope.options.pm_hoz_field.forEach(function(field, index){\n                        var field_val = Math.floor(h_index \/ field.colspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_hoz[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        h_index = h_index % field.colspan;\n                    });\n                    var v_index = i;\n                    $scope.options.pm_ver_field.forEach(function(field, index){\n                        var field_val = Math.floor(v_index \/ field.rowspan);\n                        var field_index = $scope.options.matrix_type == 1 ? $scope.options.pm_ver[index] : $scope.get_field_index( field.field_id );\n                        $scope.options.price_matrix[i][j].pm_fields[$scope.fields[field_index].id] = field_val;\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id] = {};\n                        $scope.options.price_matrix[i][j].fields[$scope.fields[field_index].id].value = field_val;\n                        v_index = v_index % field.rowspan;\n                    });\n                    if( $scope.form_values ){\n                        var _check_class = true;\n                        angular.forEach($scope.options.price_matrix[i][j].pm_fields, function(value, field_id){\n                            if( value != $scope.form_values[field_id] ) _check_class = false;\n                        });\n                        if( _check_class ) $scope.options.price_matrix[i][j].class = 'selected';\n                        if( $scope.form_values.length == 0 && i == 0 && j == 0 ){\n                            $scope.options.price_matrix[i][j].class = 'selected'; \n                            $scope.options.pm_selected = [i, j];\n                        }\n                    }\n                    if( $scope.options.matrix_type == 2 ){\n                        var priceIndex = i * $scope.options.pm_num_col + j;\n                        if( angular.isDefined( $scope.options.mpm_prices[priceIndex] ) && $scope.options.mpm_prices[priceIndex] == '' ){\n                            $scope.options.price_matrix[i][j].disable = true;\n                        }\n                    }\n                }\n            }\n        };\n        $scope.calc_turnaround_matrix = function(){\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            var delivery_field = $scope.get_field( nbOption.delivery_field_id );\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            angular.forEach( $scope.turnaround_quantity_breaks, function(_break, key){\n                angular.forEach( delivery_field.general.attributes.options, function(op, okey){\n                    var nbd_fields  = {},\n                    qty             = $scope.validate_int( _break.val ),\n                    total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    }, \n                    fixed_amount = 0;\n                    angular.copy($scope.nbd_fields, nbd_fields);\n                    nbd_fields[ nbOption.delivery_field_id ].value = okey;\n                    angular.forEach(nbd_fields, function(field, field_id){\n                        if( field.enable ){\n                            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                                if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                            }\n\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    if( $scope.is_fixed_amount( origin_field ) ){\n                                        fac \/= qty;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    factor \/= qty;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbd_fields, function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = $scope.validate_float( _break.dis );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbd_fields, function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( angular.isUndefined( $scope.turnaround_matrix[key] ) ) $scope.turnaround_matrix[key] = [];\n                    var max_qty = $scope.validate_int( op['max_qty'] ),\n                    show = false;\n                    if( op['max_qty'] == '' || max_qty >= qty ) show = true;\n                    $scope.turnaround_matrix[key][okey].show = show;\n                    $scope.turnaround_matrix[key][okey].total_cart_price = $scope.convert_to_wc_price( total_cart_price );\n                    $scope.turnaround_matrix[key][okey].final_price = $scope.convert_to_wc_price( final_price, true );\n                });\n            });\n        };\n        $scope.calculate_price_matrix = function(){\n            var i, j;\n            var basePrice = $scope.price;\n            if($scope.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n\n            var calculate_price = function( _fields, basePrice ){\n                var total_price = 0,\n                discount_by_qty = 0,\n                qty = 0,\n                cart_item_fee  = 0;\n                if( $scope.is_sold_individually == 1 ){\n                    qty = 1;\n                }else{\n                    qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n                }\n                var quantity_break = $scope.get_quantity_break(qty);\n                var xfactor = 1,\n                line_price  = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                },\n                fixed_amount = 0;\n                angular.forEach(_fields, function(field, field_id){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    if( field.enable ){\n                        var origin_field = $scope.get_field( field_id );\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, _fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }\n                                    }\n                                }\n                            }\n\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, _fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, _fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        total_price += $scope.basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        field._price += _fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        _xfac += _fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor);\n                            field.is_pp = 0;\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += ($scope.basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( (basePrice + total_price ) * (xfactor - 1 ) );\n                angular.forEach(_fields, function(field){\n                    if( field.is_pp == 1 ) {\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float( qty_factor );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = basePrice + total_price - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                var total_cart_price = final_price * qty;\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                    }\n                    cart_item_fee = total_cart_price - _total_cart_price;\n                    return final_price + cart_item_fee;\n                }\n                return final_price;\n            };  \n            var check_depend = function( field_id, pm_fields ){\n                var field = $scope.get_field(field_id),\n                check = [];\n                pm_fields[field_id].enable = true;\n                if( field.conditional.enable == 'n' ) return true;\n                if( angular.isUndefined(field.conditional.depend) ) return true;\n                if( field.conditional.depend.length == 0 ) return true;\n                var show = field.conditional.show,\n                logic = field.conditional.logic,\n                total_check = logic == 'a' ? true : false;\n                angular.forEach(field.conditional.depend, function(con, key){\n                    if( con.id != '' ){\n                        if( con.id == 'qty' ){\n                            var qty = $scope.validate_int( jQuery('input[name=\"quantity\"]').val() );\n                            if( $scope.is_sold_individually == 1 ){\n                                qty = 1;\n                            }\n                            con.val = con.val * 1;\n                        }\n                        switch(con.operator){\n                            case 'i':\n                                check[key] = pm_fields[con.id].value == con.val ? true : false;\n                                break;\n                            case 'n':\n                                check[key] = pm_fields[con.id].value != con.val ? true : false;\n                                break;  \n                            case 'e':\n                                check[key] = pm_fields[con.id].value == '' ? true : false;\n                                break;\n                            case 'ne':\n                                check[key] = pm_fields[con.id].value != '' ? true : false;\n                                break;  \n                            case 'eq':\n                                check[key] = qty == con.val ? true : false;\n                                break;\n                            case 'gt':\n                                check[key] = qty > con.val ? true : false;\n                                break;\n                            case 'lt':\n                                check[key] = qty < con.val ? true : false;\n                                break;\n                        }\n                    }else{\n                        check[key] = true;\n                    }\n                });\n                angular.forEach(check, function(c){\n                    total_check = logic == 'a' ? (total_check && c) : (total_check || c);\n                });\n                pm_fields[field_id].enable = show == 'y' ? total_check : !total_check;\n            };\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    angular.forEach($scope.nbd_fields, function(field, field_id){\n                        var val = field.value;\n                        if( angular.isDefined($scope.options.price_matrix[i][j].pm_fields[field_id]) ){\n                            val = $scope.options.price_matrix[i][j].pm_fields[field_id];\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id] = {};\n                        }\n                        angular.copy(field, $scope.options.price_matrix[i][j].fields[field_id]);\n                        if( val !== null && angular.isDefined(val) ){\n                            $scope.options.price_matrix[i][j].fields[field_id].value = '' + val;\n                        }else{\n                            $scope.options.price_matrix[i][j].fields[field_id].value = val;\n                        }\n                    });\n                    angular.forEach($scope.options.price_matrix[i][j].fields, function(field, field_id){\n                        check_depend(field_id, $scope.options.price_matrix[i][j].fields);\n                    });\n                    basePrice = $scope.options.matrix_type == 1 ? basePrice : $scope.get_mpm_base_price( i, j );\n                    var total_price = calculate_price( $scope.options.price_matrix[i][j].fields, basePrice );\n                    $scope.options.price_matrix[i][j].price = $scope.convert_to_wc_price( total_price );\n                }\n            }\n        };\n        $scope.select_price_matrix = function(_i, _j){\n            var i, j;\n            for( i = 0; i < $scope.options.pm_num_row; i++ ){\n                for( j = 0; j < $scope.options.pm_num_col; j++ ){\n                    $scope.options.price_matrix[i][j].class = '';\n                }\n            }\n            $scope.options.price_matrix[_i][_j].class = 'selected';\n            angular.copy($scope.options.price_matrix[_i][_j].fields, $scope.nbd_fields);\n            $scope.options.pm_selected = [_i, _j];\n            $scope.check_valid( false );\n        };\n        $scope.get_mpm_base_price = function(i, j){\n            var index = i * $scope.options.pm_num_col + j;\n            if( angular.isDefined( $scope.options.mpm_prices[index] ) ) return $scope.convert_wc_price_to_float( $scope.options.mpm_prices[index] );\n            return 0;\n        };\n        $scope.convert_to_wc_price = function(price, required){\n                        return accounting.formatMoney( price, {\n                symbol: nbds_frontend.currency_format_symbol,\n                decimal: nbds_frontend.currency_format_decimal_sep,\n                thousand: nbds_frontend.currency_format_thousand_sep,\n                precision: angular.isUndefined( required ) ? nbds_frontend.wc_currency_format_num_decimals : nbds_frontend.currency_format_num_decimals,\n                format: nbds_frontend.currency_format\n            });\n        };\n        $scope.convert_wc_price_to_float = function(price){ return $scope.validate_float(price);\n            var c = jQuery.trim(nbds_frontend.currency_format_thousand_sep).toString(), \n                d = jQuery.trim(nbds_frontend.currency_format_decimal_sep).toString();\n            return price = price.replace(\/ \/g, \"\"), price = \".\" === c ? price.replace(\/\\.\/g, \"\") : price.replace(new RegExp(c,\"g\"), \"\"), price = price.replace(d, \".\"), price = parseFloat(price);            \n        };\n        $scope.validate_int = function(input){\n            var output = parseInt(input);\n            if( isNaN(output) ) output = 0;\n            if( output < 0 ) output = 0;\n            return output;\n        };\n        $scope.shorten = function(num) {\n            num += '';\n            num = num.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1');\n            if( \/(\\.\\d*?)9{5,}\\d+$\/.test( num ) ){\n                var tem = num.replace(\/(\\.\\d*?)9{5,}\\d+$\/, '$1');\n                var decimals = tem.slice(tem.indexOf('.')+1),\n                num_decimal = decimals.length;\n                if( num_decimal > 0 ){\n                    var new_decimals = decimals * 1;\n                    new_decimals    += 1;\n                    tem = tem.replace(\/(\\d+\\.)(\\d+)\/, '$1' + new_decimals);\n                } else if( (\/\\d+\\.$\/).test( tem ) ) {\n                    tem = ( tem.replace(\"\\.\", \"\") * 1 ) + 1;\n                }\n                return tem.replace(\/(\\.\\d*?)0{5,}\\d+$\/, '$1') * 1;\n            }\n            return num * 1;\n        };\n        $scope.validate_float = function(input){\n            var output = parseFloat(input);\n            if( isNaN(output) ) output = 0;\n            return output;\n        };\n        $scope.get_quantity_break = function( qty ){\n            var quantity_break = {index: 0, oparator: 'gt'};\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            angular.forEach(quantity_breaks, function(_break, key){\n                if( key == 0 && qty < _break){\n                    quantity_break = {index: 0, oparator: 'lt'};\n                }\n                if( qty >= _break && key < ( quantity_breaks.length - 1 ) ){\n                    quantity_break = {index: key, oparator: 'bw'};\n                }\n                if( key == ( quantity_breaks.length - 1 ) && qty >= _break){\n                    quantity_break = {index: key, oparator: 'gt'};\n                }\n            });\n            return quantity_break;\n        };\n        $scope.calculate_price = function(){\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice        = $scope.convert_wc_price_to_float( $scope.basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            $scope.total_price      = 0;\n            $scope.discount_by_qty  = 0;\n            $scope.cart_item_fee  = {\n                enable: false,\n                value: 0\n            };\n            var qty = 0; \n            if( $scope.is_sold_individually == 1 ){\n                qty = 1;\n            }else{\n                qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            $scope._qty = qty;\n            var quantity_break  = $scope.get_quantity_break(qty);\n            var xfactor         = 1,\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, fixed_amount = 0;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                        if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                    }\n\n                    var origin_field = $scope.get_field(field_id);\n                    var factor = null;\n                    if( origin_field.general.data_type == 'i' ){\n                        if(origin_field.general.depend_quantity == 'n'){\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price, origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price;\n                            }\n                        }else{\n                            if( origin_field.general.price_type == 'mf' ){\n                                factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                            }else{\n                                factor = origin_field.general.price_breaks[quantity_break.index];\n                            }\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, $scope._qty);\n                            if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                    && origin_field.general.mesure_base_pages == 'y' ){\n                                if( angular.isDefined(nbOption.odOption.page) ){\n                                    var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                    if( _origin_field.general.data_type == 'i' ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }else{\n                                        \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                    }\n                                }\n                            }\n                        }\n                        if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                            factor = 0;\n                        }\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                origin_field.general.input_option.default = 0;\n                            }\n                            var current_value = $scope.validate_int( field.value ),\n                            default_val = $scope.validate_int( origin_field.general.input_option.default );\n                            current_value = current_value - default_val;\n                            if( current_value < 0 ) current_value = 0;\n                            var price_no_range = origin_field.general.price_no_range,\n                            len = price_no_range.length;\n                            angular.forEach(price_no_range, function(range, key){\n                                var qty = parseInt( range[0] );\n                                if( current_value >= qty ){\n                                    factor = range[1];\n                                }\n                            });\n                        }\n                    }else{\n                        var option = origin_field.general.attributes.options[field.value];\n                        if( option ){\n                            var option_price =  option.price;\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[0] );\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( option_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor = $scope.validate_float( option_price[quantity_break.index] );\n                                }\n                            }\n                            if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                    soption_price = option.sub_attributes[field.sub_value].price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                        }else{\n                                            factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    if( $scope.isMultipleSelectPage( origin_field ) ){\n                        factor = [];\n                        angular.forEach(field.values, function(val, v_index){\n                            var option = origin_field.general.attributes.options[val];\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[0], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[0];\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, $scope._qty, $scope.nbd_fields );\n                                }else{\n                                    factor[v_index] = option.price[quantity_break.index];\n                                }\n                            }\n                        });\n                        field.price = 0;\n                        var xfac = 0, _xfac = 0;\n                        angular.forEach(factor, function(fac){\n                            fac = $scope.validate_float(fac);\n                            var _fac = fac;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                fac = 0;\n                                field.ind_qty = true;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fac \/= qty;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price          += $scope.basePrice * _fac \/ 100;\n                                    $scope.total_price   += $scope.basePrice * fac \/ 100;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _fac;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price          += fac \/ 100;\n                                    field._price         += _fac \/ 100;\n                                    xfac                 += fac \/ 100;\n                                    _xfac                += _fac \/ 100;\n                                    field.is_pp          = 1;\n                                    break;\n                                case 'mf':\n                                    field.price          += _fac;\n                                    $scope.total_price   += fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _fac;\n                                    }\n                                    break;\n                            }\n                        });\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                        field.price_val = field.price * 1;\n                        field.price = $scope.convert_to_wc_price( field.price );\n                        if(origin_field.general.price_type == 'p+'){\n                            xfactor *= (1 + xfac \/ 100);\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                line_price.xfactor *= (1 + _xfac \/ 100);\n                            }\n                        }\n                    }else{\n                        factor = $scope.validate_float(factor) ;\n                        field.is_pp = 0;\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                            origin_field.general.price_type = 'f';\n                        }\n                        var _factor = factor;\n                        if( $scope.is_independent_qty( origin_field ) ){\n                            factor = 0;\n                            field.ind_qty = true;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            factor \/= qty;\n                        }\n                        switch(origin_field.general.price_type){\n                            case 'f':\n                                field.price_val = _factor;\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                            case 'p':\n                                field.price_val = $scope.basePrice * _factor \/ 100;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += ($scope.basePrice * factor \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.percent += _factor;\n                                }\n                                break;\n                            case 'p+':\n                                field.price = factor \/ 100;\n                                field._price = _factor \/ 100;\n                                xfactor *= (1 + factor \/ 100);\n                                field.is_pp = 1;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _factor \/ 100);\n                                }\n                                break;\n                            case 'c':\n                                var current_value = $scope.validate_int( field.value );\n                                if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                    ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                }\n                                field.price_val = _factor * current_value;\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * current_value;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break; \n                            case 'cp':\n                                field.price_val = _factor * $scope.validate_int( field.value.length );\n                                field.price = $scope.convert_to_wc_price( field.price_val );\n                                $scope.total_price += factor * $scope.validate_int( field.value.length );\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += field.price_val;\n                                }\n                                break;\n                            case 'mf':\n                                field.price = $scope.convert_to_wc_price( _factor );\n                                field.price_val = _factor;\n                                $scope.total_price += factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.fixed += _factor;\n                                }\n                                break;\n                        }\n                        if( $scope.is_fixed_amount( origin_field ) ){\n                            field.fixed_amount = true;\n                        }\n                    }\n                }\n            });\n            $scope.total_price += ( ($scope.basePrice + $scope.total_price ) * ( xfactor - 1 ) );\n            angular.forEach($scope.nbd_fields, function(field){\n                if( field.is_pp == 1 ){\n                    field.price_val = field.price * ($scope.basePrice + $scope.total_price ) \/ ( field.price + 1 );\n                    field.price = $scope.convert_to_wc_price( field.price_val );\n                }\n            });\n            var qty_factor = null;\n            if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                qty_factor = '';\n            }else{\n                qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n            }\n            qty_factor = $scope.validate_float(qty_factor);\n            $scope.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + $scope.total_price ) * qty_factor \/ 100;\n            $scope.final_price = $scope.total_price + $scope.basePrice - $scope.discount_by_qty;\n            $scope.final_price = $scope.final_price > 0 ? $scope.final_price : 0;\n            $scope.total_cart_price = $scope.final_price * qty;\n            if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 ){\n                $scope.cart_item_fee.enable = true;\n                var _total_cart_price = $scope.total_cart_price;\n                if( line_price.fixed != 0 ){\n                    $scope.total_cart_price += line_price.fixed;\n                }\n                if( line_price.percent != 0 ){\n                    $scope.total_cart_price += ($scope.basePrice * line_price.percent \/ 100);\n                }\n                if( line_price.xfactor != 1 ){\n                    $scope.total_cart_price += ( $scope.total_cart_price * ( line_price.xfactor - 1 ) );\n                    angular.forEach($scope.nbd_fields, function(field){\n                        if( field.is_pp == 1 && field.ind_qty ){\n                            field.price = $scope.convert_to_wc_price( field._price * $scope.total_cart_price \/ ( field._price + 1 ) );\n                        }\n                    });\n                }\n                $scope.cart_item_fee.value = $scope.total_cart_price - _total_cart_price;\n                $scope.cart_item_fee.value = $scope.convert_to_wc_price( $scope.cart_item_fee.value );\n            }\n                        $scope.total_cart_item_price_num = $scope.total_cart_price;\n                        $scope.total_cart_price = $scope.convert_to_wc_price( $scope.total_cart_price );\n                        $scope.final_price = $scope.convert_to_wc_price( $scope.final_price, true );\n            $scope.total_price = $scope.convert_to_wc_price( $scope.total_price, true );\n            $scope.discount_by_qty = $scope.convert_to_wc_price( $scope.discount_by_qty, true );\n        };\n        $scope.calculate_bulk_total_price = function(){\n            var nbb_fields_arr = [], bulk_total_price = 0;\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice ); \n            var bulk_fields = {};\n            angular.forEach($scope.bulk_fields, function(field, index){\n                var elements = jQuery('[name=\"nbb-fields[' + field.id + '][]\"]');\n                bulk_fields[field.id] = [];\n                jQuery.each( elements, function(_index, el){\n                    var val = jQuery(el).val();\n                    bulk_fields[field.id].push({\n                        value: val,\n                        value_name: field.general.attributes.options[val].name,\n                        enable: true\n                    });\n                });\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var nbb_fields = {};\n                angular.copy($scope.nbd_fields, nbb_fields);\n                angular.forEach(bulk_fields, function(field, field_id){\n                    nbb_fields[field_id] = field[index];\n                });\n                nbb_fields_arr.push( nbb_fields );\n            });\n            jQuery.each( jQuery('[name=\"nbb-qty-fields[]\"]'), function( index, qtyEl ){\n                var qty = $scope.validate_int( jQuery(qtyEl).val() );\n                if( qty > 0 ){\n                    var total_price     = 0,\n                    discount_by_qty = 0,\n                    xfactor         = 1,\n                    quantity_break  = $scope.get_quantity_break( qty ),\n                    cart_item_fee   = {enable: false},\n                    line_price      = {\n                        fixed: 0,\n                        percent: 0,\n                        xfactor: 1\n                    },\n                    fixed_amount = 0;\n                    angular.forEach(nbb_fields_arr[index], function(field, field_id){\n                        if(field.enable){\n                            var origin_field = $scope.get_field(field_id);\n                            var factor = null;\n                            if( origin_field.general.data_type == 'i' ){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price;\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                    }else{\n                                        factor = origin_field.general.price_breaks[quantity_break.index];\n                                    }\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                    factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                    if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                            && origin_field.general.mesure_base_pages == 'y' ){\n                                        if( angular.isDefined(nbOption.odOption.page) ){\n                                            var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                            if( _origin_field.general.data_type == 'i' ){\n                                                factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                            }\n                                        }\n                                    }\n                                }\n                                if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                    factor = 0;\n                                }\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                        && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                        && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                    if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                        origin_field.general.input_option.default = 0;\n                                    }\n                                    var current_value = $scope.validate_int( field.value ),\n                                    default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                    current_value = current_value - default_val;\n                                    if( current_value < 0 ) current_value = 0;\n                                    var price_no_range = origin_field.general.price_no_range,\n                                    len = price_no_range.length;\n                                    angular.forEach(price_no_range, function(range, key){\n                                        var qty = parseInt( range[0] );\n                                        if( current_value >= qty ){\n                                            factor = range[1];\n                                        }\n                                    });\n                                }\n                            }else{\n                                var option = origin_field.general.attributes.options[field.value];\n                                if(option){\n                                    var option_price =  option.price;\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[0] );\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor = $scope.validate_float( option_price[quantity_break.index] );\n                                        }\n                                    }\n                                    if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                        if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                            soption_price = option.sub_attributes[field.sub_value].price;\n                                            if(origin_field.general.depend_quantity == 'n'){\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[0], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[0] );\n                                                }\n                                            }else{\n                                                if( origin_field.general.price_type == 'mf' ){\n                                                    factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                                }else{\n                                                    factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if( $scope.isMultipleSelectPage( origin_field ) ){\n                                factor = [];\n                                angular.forEach(field.values, function(val, v_index){\n                                    var option = origin_field.general.attributes.options[val];\n                                    if(origin_field.general.depend_quantity == 'n'){\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[0];\n                                        }\n                                    }else{\n                                        if( origin_field.general.price_type == 'mf' ){\n                                            factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbb_fields_arr[index] );\n                                        }else{\n                                            factor[v_index] = option.price[quantity_break.index];\n                                        }\n                                    }\n                                });\n                                field.price = 0;\n                                var xfac = 0, _xfac = 0;\n                                angular.forEach(factor, function(fac){\n                                    fac = $scope.validate_float(fac);\n                                    var _fac = fac;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        fac = 0;\n                                        field.ind_qty = true;\n                                    }\n                                    switch(origin_field.general.price_type){\n                                        case 'f':\n                                        case 'mf':\n                                            field.price          += _fac;\n                                            if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.fixed += _fac;\n                                            }\n                                            break;\n                                        case 'p':\n                                            field.price          += basePrice * _fac \/ 100;\n                                            total_price          += basePrice * fac \/ 100;\n                                            if( $scope.is_independent_qty( origin_field ) ){\n                                                line_price.percent += _fac;\n                                            }\n                                            break;\n                                        case 'p+':\n                                            field.price          += fac \/ 100;\n                                            field._price         += _fac \/ 100;\n                                            xfac                 += fac \/ 100;\n                                            _xfac                += _fac \/ 100;\n                                            field.is_pp          = 1;\n                                            break;\n                                    }\n                                });\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += field.price;\n                                    field.fixed_amount = true;\n                                }\n                                field.price_val = field.price * 1;\n                                field.price = $scope.convert_to_wc_price( field.price );\n                                if(origin_field.general.price_type == 'p+'){\n                                    xfactor *= (1 + xfac \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _xfac \/ 100);\n                                    }\n                                }\n                            }else{\n                                factor = $scope.validate_float(factor) ;\n                                field.is_pp = 0;\n                                if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                        && origin_field.general.price_type == 'c' ){\n                                    origin_field.general.price_type = 'f';\n                                }\n                                var _factor = factor;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    factor = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price_val = _factor;\n                                        field.price = $scope.convert_to_wc_price( _factor );\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price_val = basePrice * _factor \/ 100;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += (basePrice * factor \/ 100);\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _factor;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price = factor \/ 100;\n                                        field._price = _factor \/ 100;\n                                        xfactor *= (1 + factor \/ 100);\n                                        field.is_pp = 1;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.xfactor *= (1 + _factor \/ 100);\n                                        }\n                                        break;\n                                    case 'c':\n                                        var current_value = $scope.validate_int( field.value );\n                                        if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                            ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                            if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                                origin_field.general.input_option.default = 0;\n                                            }\n                                            var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                            current_value = current_value - default_val;\n                                            if( current_value < 0 ) current_value = 0;\n                                        }\n                                        field.price_val = _factor * current_value;\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * current_value;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _factor * current_value;\n                                        }\n                                        break; \n                                    case 'cp':\n                                        field.price_val = _factor * $scope.validate_int( field.value.length );\n                                        field.price = $scope.convert_to_wc_price( field.price_val );\n                                        total_price += factor * $scope.validate_int( field.value.length );\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += field.price_val;\n                                        }\n                                        break;\n                                }\n                                if( $scope.is_fixed_amount( origin_field ) ){\n                                    fixed_amount += factor;\n                                    field.fixed_amount = true;\n                                }\n                            }\n                        }\n                    });\n                    total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                    angular.forEach(nbb_fields_arr[index], function(field){\n                        if( field.is_pp == 1 ){\n                            field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                            field.price = $scope.convert_to_wc_price( field.price_val );\n                        }\n                    });\n                    var qty_factor = null;\n                    if( quantity_break.index == 0 && quantity_break.oparator == 'lt' ){\n                        qty_factor = '';\n                    }else{\n                        qty_factor = $scope.options.quantity_breaks[quantity_break.index].dis;\n                    }\n                    var qty_factor = $scope.validate_float( qty_factor );\n                    discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                    var final_price = total_price + basePrice - discount_by_qty;\n                    final_price = final_price > 0 ? final_price : 0;\n                    total_cart_price = final_price * qty;\n                    var _total_cart_price = total_cart_price;\n                    if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                        if( line_price.fixed != 0 ){\n                            total_cart_price += line_price.fixed;\n                        }\n                        if( line_price.percent != 0 ){\n                            total_cart_price += (basePrice * line_price.percent \/ 100);\n                        }\n                        if( line_price.xfactor != 1 ){\n                            total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                            angular.forEach(nbb_fields_arr[index], function(field){\n                                if( field.is_pp == 1 && field.ind_qty ){\n                                    field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                                }\n                            });\n                        }\n                        cart_item_fee.value = total_cart_price - _total_cart_price;\n                        if( cart_item_fee.value > 0 ){\n                            cart_item_fee.enable = true;\n                        }\n                        cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                    }\n                    if( $scope.options.quantity_discount_type == 'f' ){\n                        total_cart_price += fixed_amount;\n                    }else{\n                        total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                    }\n                    bulk_total_price += total_cart_price;\n                }\n            });\n            bulk_total_price = bulk_total_price > 0 ? bulk_total_price : 0;\n            $scope.total_cart_item_price_num = bulk_total_price;\n            var bulk_total_price_html = $scope.convert_to_wc_price( bulk_total_price );\n                    };\n        $scope.calculate_price_table2 = function(){\n            $scope.price_table = [];\n            var basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : basePrice;\n            }\n            basePrice = $scope.convert_wc_price_to_float( basePrice );\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var missing_one = true;\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                if( _break.val == '1' ) missing_one = false;\n            });\n            var quantity_breaks = [];\n            angular.copy($scope.options.quantity_breaks, quantity_breaks);\n            if( missing_one ){\n               quantity_breaks.unshift({val: 1, dis: 0});\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var qty         = $scope.validate_int(_break.val),\n                nbd_fields      = {},\n                total_price     = 0,\n                discount_by_qty = 0,\n                xfactor         = 1,\n                quantity_break  = $scope.get_quantity_break( qty ),\n                cart_item_fee   = {enable: false},\n                line_price      = {\n                    fixed: 0,\n                    percent: 0,\n                    xfactor: 1\n                }, \n                fixed_amount = 0;\n                angular.copy($scope.nbd_fields, nbd_fields);\n                angular.forEach(nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[quantity_break.index], origin_field, qty, nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, qty);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        var _origin_field = $scope.get_field(nbOption.odOption.page.field_id);\n                                        if( _origin_field.general.data_type == 'i' ){\n                                            factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                        }else{\n                                            \/* factor *= Math.floor( (nbOption.odOption.page.list_page.length + 1) \/ 2 ); *\/\n                                        }\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                var option_price =  option.price;\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option_price[quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[quantity_break.index], origin_field, qty, nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[quantity_break.index], origin_field, qty, nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0, _xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                    field.ind_qty = true;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price          += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) total_price += fac;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.fixed += _fac;\n                                        }\n                                        break;\n                                    case 'p':\n                                        field.price          += basePrice * _fac \/ 100;\n                                        total_price          += basePrice * fac \/ 100;\n                                        if( $scope.is_independent_qty( origin_field ) ){\n                                            line_price.percent += _fac;\n                                        }\n                                        break;\n                                    case 'p+':\n                                        field.price          += fac \/ 100;\n                                        field._price         += _fac \/ 100;\n                                        xfac                 += fac \/ 100;\n                                        _xfac                += _fac \/ 100;\n                                        field.is_pp          = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price );\n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    line_price.xfactor *= (1 + _xfac \/ 100);\n                                }\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                                field.ind_qty = true;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) total_price += factor;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += _factor;\n                                    }\n                                    break;\n                                case 'p':\n                                    field.price_val = basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price( basePrice * _factor \/ 100 );\n                                    total_price += (basePrice * factor \/ 100);\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.percent += _factor;\n                                    }\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    field._price = _factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.xfactor *= (1 + _factor \/ 100);\n                                    }\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * current_value;\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    total_price += factor * $scope.validate_int( field.value.length );\n                                    if( $scope.is_independent_qty( origin_field ) ){\n                                        line_price.fixed += field.price_val;\n                                    }\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                total_price += ( ( basePrice + total_price ) * ( xfactor - 1 ) );\n                angular.forEach(nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * (basePrice + total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = $scope.validate_float( _break.dis );\n                discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : (basePrice + total_price ) * qty_factor \/ 100;\n                var final_price = total_price + basePrice - discount_by_qty;\n                final_price = final_price > 0 ? final_price : 0;\n                total_cart_price = final_price * qty;\n                var _total_cart_price = total_cart_price;\n                if( line_price.fixed != 0 || line_price.xfactor != 1 || line_price.percent != 0 || fixed_amount > 0 ){\n                    if( line_price.fixed != 0 ){\n                        total_cart_price += line_price.fixed;\n                    }\n                    if( line_price.percent != 0 ){\n                        total_cart_price += (basePrice * line_price.percent \/ 100);\n                    }\n                    if( line_price.xfactor != 1 ){\n                        total_cart_price += ( total_cart_price * ( line_price.xfactor - 1 ) );\n                        angular.forEach(nbd_fields, function(field){\n                            if( field.is_pp == 1 && field.ind_qty ){\n                                field.price = $scope.convert_to_wc_price( field._price * total_cart_price \/ ( field._price + 1 ) );\n                            }\n                        });\n                    }\n                    cart_item_fee.value = total_cart_price - _total_cart_price + fixed_amount;\n                    if( cart_item_fee.value > 0 ){\n                        cart_item_fee.enable = true;\n                    }\n                    cart_item_fee.value = $scope.convert_to_wc_price( cart_item_fee.value );\n                }\n                if( $scope.options.quantity_discount_type == 'f' ){\n                    total_cart_price += fixed_amount;\n                }else{\n                    total_cart_price += fixed_amount * ( 100 - qty_factor ) \/ 100;\n                }\n                $scope.price_table[key] = {\n                    qty: qty,\n                    cart_item_fee: cart_item_fee,\n                    total_cart_price: $scope.convert_to_wc_price( total_cart_price ),\n                    _total_cart_price: $scope.convert_to_wc_price( _total_cart_price ),\n                    final_price_val: final_price,\n                    final_price: $scope.convert_to_wc_price( final_price, true )\n                };\n            });\n            $scope.price_table_cart_fee = false;\n            var _first = $scope.price_table[0];\n            angular.forEach($scope.price_table, function(pt, key){\n                if( angular.isDefined( pt.cart_item_fee.enable ) && pt.cart_item_fee.enable ){\n                    $scope.price_table_cart_fee = true;\n                }\n                if( pt.final_price_val.toFixed != 0 ){\n                    pt.klass = ((pt.final_price_val - _first.final_price_val) > 0 ) ? 'nbo-inc' : ( ((pt.final_price_val - _first.final_price_val) < 0 ) ? 'nbo-dec' : '' );\n                    pt.saving = ( -(pt.final_price_val - _first.final_price_val) \/ _first.final_price_val * 100 ).toFixed(2) + '%';\n                }else{\n                    pt.saving = '';\n                }\n            });\n            if( missing_one ){\n                $scope.price_table.splice(0, 1);\n            }\n        };\n        $scope.calculate_price_table = function(){\n            $scope.price_table = [];\n            $scope.basePrice = $scope.price;\n            if(this.type == 'variable'){\n                var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val();\n                $scope.basePrice = (variation_id != '' && variation_id != 0 ) ? $scope.variations[variation_id] : $scope.basePrice;\n            }\n            $scope.basePrice = $scope.convert_wc_price_to_float($scope.basePrice);\n            if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                var pmi = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[0] : 0,\n                pmj = angular.isDefined( $scope.options.pm_selected ) ? $scope.options.pm_selected[1] : 0;\n                $scope.basePrice = $scope.get_mpm_base_price( pmi, pmj );\n            }\n            var quantity_breaks = [];\n            angular.forEach($scope.options.quantity_breaks, function(_break, key){\n                quantity_breaks[key] = $scope.validate_int(_break.val);\n            });\n            var _qty = 0;\n            if( $scope.is_sold_individually == 1 ){\n                _qty = 1;\n            }else{\n                _qty = $scope.validate_int(jQuery('input[name=\"quantity\"]').val());\n            }\n            angular.forEach(quantity_breaks, function(_break, key){\n                var pt;\n                if( key == 0 && _break > 1 ) {\n                    pt = {};\n                    pt.from = 1;\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: 0, oparator: 'lt'};\n                    $scope.price_table.push(pt);\n                }\n                if( key > 0 && key < (quantity_breaks.length) ){\n                    pt = {};\n                    pt.from = quantity_breaks[key - 1];\n                    pt.up = _break - 1;\n                    pt.quantity_break = {index: key - 1, oparator: 'bw'};\n                    $scope.price_table.push(pt);\n                }\n                if( key == (quantity_breaks.length - 1) ){\n                    pt = {};\n                    pt.from = _break;\n                    pt.up = '**';\n                    pt.quantity_break = {index: key, oparator: 'gt'};\n                    $scope.price_table.push(pt);\n                }\n            });\n            angular.forEach($scope.price_table, function(pt, pt_index){\n                pt.nbd_fields = {};\n                pt.in_range = ( _qty >= pt.from && ( _qty <= pt.up || pt.up == '**' ) ) ? true : false;\n                angular.copy($scope.nbd_fields, pt.nbd_fields);\n                pt.total_price = 0;\n                pt.discount_by_qty = 0;\n                var xfactor = 1, fixed_amount = 0;\n                angular.forEach(pt.nbd_fields, function(field, field_id){\n                    if( field.enable ){\n                        if( $scope.has_price_matrix && $scope.options.matrix_type == 2 ){\n                            if( $scope.options.pm_hoz.indexOf( field_id ) > -1 || $scope.options.pm_ver.indexOf( field_id ) > -1 ) return;\n                        }\n\n                        var origin_field = $scope.get_field(field_id);\n                        var factor = null;\n                        if( origin_field.general.data_type == 'i' ){\n                            if(origin_field.general.depend_quantity == 'n'){\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price, origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price;\n                                }\n                            }else{\n                                if( origin_field.general.price_type == 'mf' ){\n                                    factor = $scope.eval_price( origin_field.general.price_breaks[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                }else{\n                                    factor = origin_field.general.price_breaks[pt.quantity_break.index];\n                                }\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                    && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                                factor = $scope.calculate_price_base_measurement(origin_field, field.width, field.height, pt.from);\n                                if( (origin_field.general.price_type == 'f' || origin_field.general.price_type == 'c')\n                                        && origin_field.general.mesure_base_pages == 'y' ){\n                                    if( angular.isDefined(nbOption.odOption.page) ){\n                                        factor *= Math.floor( (nbOption.odOption.page.number + 1) \/ 2 );\n                                    }\n                                }\n                            }\n                            if( origin_field.general.input_type == 'u' && ( angular.isUndefined(field.value) || field.value == \"\" ) ){\n                                factor = 0;\n                            }\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' \n                                    && angular.isDefined(origin_field.general.price_depend_no) && origin_field.general.price_depend_no == 'y' \n                                    && angular.isDefined(origin_field.general.price_no_range) && origin_field.general.price_no_range.length > 0 ){\n                                if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                    origin_field.general.input_option.default = 0;\n                                }\n                                var current_value = $scope.validate_int( field.value ),\n                                default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                current_value = current_value - default_val;\n                                if( current_value < 0 ) current_value = 0;\n                                var price_no_range = origin_field.general.price_no_range,\n                                len = price_no_range.length;\n                                angular.forEach(price_no_range, function(range, key){\n                                    var qty = parseInt( range[0] );\n                                    if( current_value >= qty ){\n                                        factor = range[1];\n                                    }\n                                });\n                            }\n                        }else{\n                            var option = origin_field.general.attributes.options[field.value];\n                            if(option){\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[0] );\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor = $scope.validate_float( option.price[pt.quantity_break.index] );\n                                    }\n                                }\n                                if( angular.isDefined(option.enable_subattr) && option.enable_subattr == 'on' ){\n                                    if(angular.isDefined(option.sub_attributes) && option.sub_attributes.length > 0){\n                                        soption_price = option.sub_attributes[field.sub_value].price;\n                                        if(origin_field.general.depend_quantity == 'n'){\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[0], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[0] );\n                                            }\n                                        }else{\n                                            if( origin_field.general.price_type == 'mf' ){\n                                                factor += $scope.eval_price( soption_price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                            }else{\n                                                factor += $scope.validate_float( soption_price[pt.quantity_break.index] );\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        if( $scope.isMultipleSelectPage( origin_field ) ){\n                            factor = [];\n                            angular.forEach(field.values, function(val, v_index){\n                                var option = origin_field.general.attributes.options[val];\n                                if(origin_field.general.depend_quantity == 'n'){\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[0], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[0];\n                                    }\n                                }else{\n                                    if( origin_field.general.price_type == 'mf' ){\n                                        factor[v_index] = $scope.eval_price( option.price[pt.quantity_break.index], origin_field, pt.from, pt.nbd_fields );\n                                    }else{\n                                        factor[v_index] = option.price[pt.quantity_break.index];\n                                    }\n                                }\n                            });\n                            field.price = 0;\n                            var xfac = 0;\n                            angular.forEach(factor, function(fac){\n                                fac = $scope.validate_float(fac);\n                                var _fac = fac;\n                                if( $scope.is_independent_qty( origin_field ) ){\n                                    fac = 0;\n                                }\n                                switch(origin_field.general.price_type){\n                                    case 'f':\n                                    case 'mf':\n                                        field.price += _fac;\n                                        if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += fac;\n                                        break;\n                                    case 'p':\n                                        field.price += $scope.basePrice * _fac \/ 100;\n                                        pt.total_price += $scope.basePrice * fac \/ 100;\n                                        break;\n                                    case 'p+':\n                                        field.price += fac \/ 100;\n                                        xfac += fac \/ 100;\n                                        field.is_pp = 1;\n                                        break;\n                                }\n                            });\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += field.price;\n                                field.fixed_amount = true;\n                            }\n                            field.price_val = field.price * 1;\n                            field.price = $scope.convert_to_wc_price( field.price ); \n                            if(origin_field.general.price_type == 'p+'){\n                                xfactor *= (1 + xfac \/ 100);\n                            }\n                        }else{\n                            factor = $scope.validate_float(factor) ;\n                            field.is_pp = 0;\n                            if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                                && origin_field.general.price_type == 'c' ){\n                                origin_field.general.price_type = 'f';\n                            }\n                            var _factor = factor;\n                            if( $scope.is_independent_qty( origin_field ) ){\n                                factor = 0;\n                            }\n                            switch(origin_field.general.price_type){\n                                case 'f':\n                                case 'mf':\n                                    field.price_val = _factor;\n                                    field.price = $scope.convert_to_wc_price( _factor );\n                                    if( ! $scope.is_fixed_amount( origin_field ) ) pt.total_price += factor;\n                                    break;\n                                case 'p':\n                                    field.price_val = $scope.basePrice * _factor \/ 100;\n                                    field.price = $scope.convert_to_wc_price(field.price_val );\n                                    pt.total_price += ($scope.basePrice * factor \/ 100);\n                                    break;\n                                case 'p+':\n                                    field.price = factor \/ 100;\n                                    xfactor *= (1 + factor \/ 100);\n                                    field.is_pp = 1;\n                                    break;\n                                case 'c':\n                                    var current_value = $scope.validate_int( field.value );\n                                    if( ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page' && origin_field.general.data_type == 'i' ) ||\n                                        ( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'page1' ) || ( angular.isDefined(origin_field.nbe_type) && origin_field.nbe_type == 'number_file' ) ){\n                                        if( angular.isUndefined( origin_field.general.input_option.default ) || origin_field.general.input_option.default == '' ){\n                                            origin_field.general.input_option.default = 0;\n                                        }\n                                        var default_val = $scope.validate_int( origin_field.general.input_option.default );\n                                        current_value = current_value - default_val;\n                                        if( current_value < 0 ) current_value = 0;\n                                    }\n                                    field.price_val = _factor * current_value;\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * current_value;\n                                    break; \n                                case 'cp':\n                                    field.price_val = _factor * $scope.validate_int( field.value.length );\n                                    field.price = $scope.convert_to_wc_price( field.price_val );\n                                    pt.total_price += factor * $scope.validate_int( field.value.length );\n                                    break;\n                            }\n                            if( $scope.is_fixed_amount( origin_field ) ){\n                                fixed_amount += factor;\n                                field.fixed_amount = true;\n                            }\n                        }\n                    }\n                });\n                pt.total_price += ( ($scope.basePrice + pt.total_price ) * (xfactor - 1 ) );\n                angular.forEach(pt.nbd_fields, function(field){\n                    if( field.is_pp == 1 ){\n                        field.price_val = field.price * ($scope.basePrice + pt.total_price ) \/ ( field.price + 1 );\n                        field.price = $scope.convert_to_wc_price( field.price_val );\n                    }\n                });\n                var qty_factor = null;\n                if( pt.quantity_break.index == 0 && pt.quantity_break.oparator == 'lt' ){\n                    qty_factor = '';\n                }else{\n                    qty_factor = $scope.options.quantity_breaks[pt.quantity_break.index].dis;\n                }\n                qty_factor = $scope.validate_float(qty_factor);\n                pt.discount_by_qty = $scope.options.quantity_discount_type == 'f' ? qty_factor : ($scope.basePrice + pt.total_price ) * qty_factor \/ 100;\n                pt.final_price = pt.total_price + $scope.basePrice - pt.discount_by_qty;\n                pt.final_price = pt.final_price > 0 ? pt.final_price : 0;\n                pt.final_price = $scope.convert_to_wc_price( pt.final_price, true );\n                pt.total_price = $scope.convert_to_wc_price( pt.total_price, true );\n                pt.discount_by_qty = $scope.convert_to_wc_price( pt.discount_by_qty, true );\n            });\n        };\n        $scope.is_independent_qty = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.is_fixed_amount = function( field ){\n            if( angular.isDefined( field.general.depend_qty ) && field.general.depend_qty == 'n2' ){\n                return true;\n            }else{\n                return false;\n            }\n        };\n        $scope.isMultipleSelectPage = function(field){\n            if( angular.isDefined(field.nbd_type) && ( field.nbd_type == 'page' || field.nbd_type == 'page2' ) && field.general.data_type == 'm' ){\n                return true;\n            }\n            return false;\n        };\n        $scope.calculate_price_base_measurement = function(origin_field, width, height, qty){\n            var mesure_range = origin_field.general.mesure_range;\n            var area = $scope.validate_float( width ) * $scope.validate_float( height ),\n            _area = area;\n\n            if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                area *= qty;\n            }\n\n            if( angular.isDefined( origin_field.general.mesure_min_area ) ){\n                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                _area -= minArea;\n                area -= minArea;\n            }\n            _area = _area > 0 ? _area : 0;\n            area = area > 0 ? area : 0;\n\n            var price_per_unit = 0, start_range = 0, end_range = 0, price_range = 0;\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'ur' ){\n                var measurement_price = 0, infinity_end_range = false, area_in_range, prev_end_range = 0;\n                angular.forEach(mesure_range, function(range, key){\n                    start_range = $scope.validate_float(range[0]);\n                    end_range = $scope.validate_float(range[1]);\n                    price_range = $scope.validate_float(range[2]);\n                    start_range = start_range > 0 ? start_range : 0;\n                    end_range = end_range > 0 ? end_range : 0;\n                    price_range = price_range > 0 ? price_range : 0;\n\n                    if( !infinity_end_range && area >= start_range && ( end_range > start_range || end_range == 0 ) ){\n                        area_in_range = ( area >= end_range && end_range != 0 ) ? ( end_range - prev_end_range ) : ( area - prev_end_range );\n                        measurement_price += area_in_range * price_range;\n                        prev_end_range = end_range;\n                    }\n                    if( end_range == 0 ) infinity_end_range = true;\n                });\n\n                if( angular.isDefined( origin_field.general.mesure_base_qty ) && origin_field.general.mesure_base_qty == 'y' ){\n                    measurement_price \/= ( qty != 0 ? qty : 1 );\n                }\n\n                return measurement_price;\n            }\n            angular.forEach(mesure_range, function(range, key){\n                start_range = $scope.validate_float(range[0]);\n                end_range = $scope.validate_float(range[1]);\n                price_range = $scope.validate_float(range[2]);\n                if( start_range <= area && ( area <= end_range || end_range == 0 ) ){\n                    price_per_unit = price_range;\n                }\n                if( start_range <= area && key == ( mesure_range.length - 1 ) && area > end_range  ){\n                    price_per_unit = price_range;\n                }\n            });\n            if( angular.isDefined( origin_field.general.mesure_type ) && origin_field.general.mesure_type == 'r' ) return price_per_unit;\n            return price_per_unit * _area;\n        };\n        $scope.calculate_product_area = function(){\n            var area = 0, hasDim = false;\n            angular.forEach($scope.nbd_fields, function(field, field_id){\n                if( field.enable ){\n                    var origin_field = $scope.get_field( field_id );\n                    if( origin_field.general.data_type == 'i' ){\n                        if( angular.isDefined(origin_field.nbd_type) && origin_field.nbd_type == 'dimension' \n                            && origin_field.general.mesure == 'y' && angular.isDefined(origin_field.general.mesure_range) && origin_field.general.mesure_range.length > 0 ){\n                            area = $scope.validate_float( field.width ) * $scope.validate_float( field.height );\n                            if( angular.isDefined(origin_field.general.mesure_min_area) ){\n                                var minArea = $scope.validate_float( origin_field.general.mesure_min_area );\n                                area -= minArea;\n                            }\n                            hasDim = true;\n                        }\n                    }\n                }\n            });\n            if( !hasDim ){\n                if( $scope.type == 'variable' ){\n                    var variation_id = jQuery('input[name=\"variation_id\"], input.variation_id').val(),\n                    width = $scope.dimensions[variation_id].width,\n                    height = $scope.dimensions[variation_id].height;\n                }else{\n                    width = $scope.width;\n                    height = $scope.height;\n                }\n                area = $scope.validate_float( width ) * $scope.validate_float( height );\n            }\n            return area > 0 ? area : 0;\n        };\n        $scope.eval_price = function( formula, origin_field, qty, fields ){\n            if( !formula ) return 0;\n\n            var price = 0,\n            area = $scope.calculate_product_area();\n\n            formula = formula.replace(\/{quantity}\/g, qty);\n            formula = formula.replace(\/{price}\/g, $scope.basePrice);\n            formula = formula.replace(\/{area}\/g, area);\n            formula = formula.replace(\/{this.value}\/g, fields[origin_field.id].value);\n            formula = formula.replace(\/{this.value_length}\/g, fields[origin_field.id].value.length);\n\n            if (formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/)) {\n                var matches = formula.match(\/\\{(\\s)*?field\\.([^}]*)}\/g),\n                pos, reg, field_id, type, val;\n                matches.forEach(function (field) {\n                    match = field.match(\/\\{(\\s)*?field\\.([^}]*)}\/);\n                    if (undefined !== match[2] && \"string\" == typeof match[2]) {\n                        pos = match[2].lastIndexOf(\".\");\n                        val = 0;\n\n                        if ( pos !== -1 ) {\n                            field_id = match[2].substr(0, pos);\n                            type = match[2].substr(pos + 1);\n\n                            switch (type) {\n                                case 'price':\n                                    val = angular.isDefined( fields[field_id].price_val ) ? fields[field_id].price_val : 0;\n                                    break;\n                                case 'value':\n                                    val = fields[field_id].value;\n                                    break;\n                                case 'value_length':\n                                    val = fields[field_id].value.length;\n                                    break;\n                                case 'implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option && angular.isDefined( option.implicit_value ) ){\n                                            val = option.implicit_value;\n                                        }\n                                    }\n                                    break;\n                                case 'sub_implicit_value':\n                                    var _origin_field = $scope.get_field( field_id );\n                                    if( _origin_field.general.data_type == 'm' ){\n                                        var field_value = fields[field_id].value;\n                                        var option = _origin_field.general.attributes.options[field_value];\n                                        if( option ){\n                                            if( angular.isDefined( option.enable_subattr ) && option.enable_subattr == 'on' \n                                                && angular.isDefined( option.sub_attributes ) && option.sub_attributes.length > 0 ){\n                                                var sub_field_value = fields[field_id].sub_value;\n                                                var sub_option = option.sub_attributes[sub_field_value];\n                                                if( sub_option && angular.isDefined( sub_option.implicit_value ) ){\n                                                    val = sub_option.implicit_value;\n                                                }\n                                            }\n                                        }\n                                    }\n                                    break;\n                            }\n                        }\n\n                        reg = new RegExp(match[0]);\n                        formula = formula.replace(reg, val + '');\n                    }\n                });\n            }\n\n            try {\n                price = mexp.eval(formula);\n            } catch (e) {\n                price = 0;\n            }\n\n            return price;\n        };\n        $scope.toggle_group = function( $event ){\n            jQuery($event.target).parents( '.nbo-group-body' ).toggleClass('nbo-collapse');\n            jQuery($event.target).parents( '.nbo-group-type2-wrap' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_float_summary = function(){\n            jQuery( '.nbo-float-summary' ).toggleClass('nbo-collapse');\n        };\n        $scope.toggle_field = function( $event ){\n            jQuery($event.target).parents( '.nbd-option-field' ).toggleClass('nbo-collapse');\n        };\n        $scope.select_adv_attr = function( field_id, attr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.check_valid();\n        };\n        $scope.select_adv_subattr = function( field_id, attr_index, subattr_index ){\n            $scope.nbd_fields[field_id].value = attr_index;\n            $scope.nbd_fields[field_id].sub_value = subattr_index;\n            $scope.check_valid();\n        };\n        $scope.changeGroupPanel = function( $event, command ){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                if( command == 'prev' ){\n                    if( $scope.current_group_panel > 0 ) $scope.current_group_panel--;\n                }else if( command == 'next' ){\n                    if( $scope.current_group_panel < ( $scope.no_of_group - 1 ) ) $scope.current_group_panel++;\n                }else{\n                    if( command >= 0 && command < $scope.no_of_group ){\n                        $scope.current_group_panel = command;\n                    }\n                }\n                var height = wrapper.find('.nbo-group-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                if( wrapper.find('.nbo-group-type2-wrap').length ){\n                    height = wrapper.find('.nbo-group-type2-wrap:nth(' + ( $scope.current_group_panel ) + ')').outerHeight();\n                }\n                wrapper.find('.nbo_group_panel_wrap').css('height', ( height + 15 ) + 'px');\n            });\n        };\n        $scope.groupPageInit = false;\n        $scope.currentGroupPage = 0;\n        $scope.totalGroupPage = 1;\n        $scope.groupTimeLineTranslate = '0%';\n        $scope.initGroupTimeline = function(){\n            $timeout(function(){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper'),\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n\n                if( timelineWidth > containerWidth ){\n                    $scope.totalGroupPage++;\n                    $timeout(function(){\n                        containerWidth = timelineCon.innerWidth(),\n                        timelineWidth = timelineLine.outerWidth();\n\n                        $scope.totalGroupPage = Math.ceil( timelineWidth \/ containerWidth );\n                        $scope.changeGroupPage( null, 0 );\n                    });\n                }else{\n                    $scope.changeGroupPage( null, 0 );\n                }\n            });\n        };\n        $scope.changeGroupPage = function( $event, command ){\n            if( command == 'prev' ){\n                if( $scope.currentGroupPage > 0 ) $scope.currentGroupPage--;\n            }else if( command == 'next' ){\n                if( $scope.currentGroupPage < ( $scope.totalGroupPage - 1 ) ) $scope.currentGroupPage++;\n            }else{\n                if( command >= 0 && command < $scope.totalGroupPage ){\n                    $scope.currentGroupPage = command;\n                }\n            }\n            if( $scope.currentGroupPage == ( $scope.totalGroupPage - 1 ) ){\n                var wrapper = jQuery( '#' + nbOption.crtlId ).find('.nbo-fields-wrapper');\n                timelineCon = wrapper.find('.nbo-group-timeline-wrap'),\n                timelineLine = wrapper.find('.nbo-group-timeline-line'),\n                containerWidth = timelineCon.innerWidth(),\n                timelineWidth = timelineLine.outerWidth();\n                if( containerWidth < timelineWidth ) $scope.groupTimeLineTranslate = ( containerWidth - timelineWidth ) + 'px';\n            }else{\n                $scope.groupTimeLineTranslate = -$scope.currentGroupPage * 100 \/ $scope.totalGroupPage + '%';\n            }\n        };\n        $scope.update_app = function(){\n            if ($scope.$root.$$phase !== \"$apply\" && $scope.$root.$$phase !== \"$digest\") $scope.$apply(); \n        };\n        $scope.init();\n    }]).directive('stringToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(value) {\n                    if( value === null ) value = '';\n                    return '' + value;\n                });\n                ngModel.$formatters.push(function(value) {\n                    return parseFloat(value);\n                });\n            }\n        };\n    }).directive('convertToNumber', function() {\n        return {\n            require: 'ngModel',\n            link: function(scope, element, attrs, ngModel) {\n                ngModel.$parsers.push(function(val) {\n                    return val != null ? parseInt(val, 10) : null;\n                });\n                ngModel.$formatters.push(function(val) {\n                    return val != null ? '' + val : null;\n                });\n            }\n        };\n    }).directive('nboClickDebounce', function ($timeout) {\n        var delay = 500;\n        return {\n            restrict: 'A',\n            priority: -1,\n            link: function (scope, elem) {\n                var disabled = false;\n                function onClick(evt) {\n                    if (disabled) {\n                        evt.preventDefault();\n                        evt.stopImmediatePropagation();\n                    } else {\n                        disabled = true;\n                        $timeout(function () { disabled = false; }, delay, false);\n                    }\n                }\n                scope.$on('$destroy', function () { elem.off('click', onClick); });\n                elem.on('click', onClick);\n            }\n        };\n    }).directive( 'nbdHelpTip', function($timeout) {\n        return {\n            restrict: 'C',\n            scope: {\n                position: '@position'\n            },\n            link: function( scope, element, attrs ) {\n                var tiptip_args = {\n                    'attribute': 'data-tip',\n                    'fadeIn': 50,\n                    'fadeOut': 50,\n                    'delay': 200,\n                    defaultPosition: scope.position ? scope.position : \"top\"\n                };\n                $timeout(function() {\n                    jQuery(element).tipTip( tiptip_args );\n                }, 0);\n            }\n        };\n    }).directive( 'nboAdvDropdown', function($timeout){\n        return {\n            restrict: 'A',\n            link: function( scope, element, attrs ){\n                $timeout(function() {\n                    jQuery('body').click(function( event ){\n                        jQuery.each( jQuery('.nbd-field-ad-dropdown-wrap'), function( ind, el ){\n                            var re_el = jQuery( el ).find('.nbo-ad-result');\n                            if( !( re_el.is( jQuery(event.target) ) \n                                    || jQuery( event.target ).parents('.nbo-ad-result').is( re_el )\n                                    || jQuery(event.target).is( jQuery(element).find('.nbo-ad-pseudo-sublist-toggle') ) ) ){\n                                jQuery( el ).removeClass('active');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                                jQuery( el ).find('.nbo-ad-pseudo-sublist').removeClass('active');\n                            }\n                        });\n                    });\n                    jQuery(element).find('.nbo-ad-result').on('click', function(){\n                        jQuery(element).toggleClass('active');\n                    });\n                    jQuery(element).find('.nbo-ad-pseudo-sublist-toggle').on('click', function(e){\n                        e.stopPropagation();\n                        var sublist_el = jQuery(this).next('.nbo-ad-pseudo-sublist');\n                        jQuery.each( jQuery(element).find('.nbo-ad-pseudo-sublist'), function(){\n                            if( !jQuery(this).is( sublist_el ) ){\n                                jQuery(this).removeClass('active');\n                                jQuery(this).prev('.nbo-ad-pseudo-sublist-toggle').removeClass('nbo-rotate-180');\n                            }\n                        });\n                        jQuery(this).toggleClass('nbo-rotate-180');\n                        sublist_el.toggleClass('active');\n                    });\n                });\n            }\n        }\n    }).directive( 'nboInputFile', function($timeout, $window) {\n        return {\n            restrict: 'A',\n            require: 'ngModel',\n            scope: {\n                fileChange: '&',\n                fieldId: '@fieldId',\n                types: '@types',\n                file: '@',\n                filename: '@',\n                uploaded: '@',\n                minsize: '@',\n                maxsize: '@'\n            },\n            link: function( scope, element, attrs, ctrl ) {\n                if( scope.uploaded == 1 ){\n                    ClipboardEvent = $window.ClipboardEvent,\n                    DataTransfer = $window.DataTransfer;\n                    try {\n                        var el = element[0];\n                        if (ClipboardEvent || DataTransfer ){\n                            var dT = new ClipboardEvent('').clipboardData || new DataTransfer();\n                            dT.items.add(new File([scope.file], scope.filename));\n                            el.files = dT.files;\n                            onChange( 'init' );\n                        }\n                    }catch(err){\n                        console.log(err);\n                    }\n                }\n                element.on('change', onChange);\n                scope.$on('destroy', function () {\n                    element.off('change', onChange);\n                });\n                function onChange( init ) {\n                    if( init != 'init' ){\n                        var file = element[0].files[0];\n                        if( file ){\n                            function resetInput(){\n                                ctrl.$setViewValue('');\n                                jQuery(element).val('');\n                                scope.fileChange();\n                                return false;\n                            };\n                            if( scope.maxsize != '' ){\n                                var max_size = parseInt( scope.maxsize ) * 1024 * 1024;\n                                if( max_size < file.size ){\n                                    alert(\"Sorry, file is too big, max size: \" + scope.maxsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.minsize != '' ){\n                                var minsize = parseInt( scope.minsize ) * 1024 * 1024;\n                                if( minsize > file.size ){\n                                    alert(\"Sorry, file is too small, min size: \" + scope.minsize + 'MB');\n                                    resetInput();\n                                }\n                            }\n                            if( scope.types != '' ){\n                                var types = scope.types.replace(\/ \/g,'').split(','),\n                                filetype = file.type.toLowerCase(),\n                                checType = false;\n                                filetype = '';\n                                filetype = filetype != '' ? filetype : file.name.substring(file.name.lastIndexOf('.')+1).toLowerCase();\n                                angular.forEach(types, function(type){\n                                    if( filetype.indexOf(type) > -1 ){\n                                        checType = true;\n                                    }\n                                });\n                                if( !checType ){\n                                    alert(\"Sorry, this file type is not permitted for security reasons. Only accept: \" + scope.types);\n                                    resetInput();\n                                }\n                            }\n                        }\n                    }\n                    if( element[0].files[0] ){\n                        ctrl.$setViewValue(element[0].files[0]);\n                    }else{\n                        ctrl.$setViewValue( '' );\n                    }\n                    jQuery(element).parent('.nbd-field-content').find('.nbd-upload-hidden').remove();\n                    scope.fileChange();\n                }\n            }\n        };\n    }).directive( 'nboDisabled', function($timeout) {\n        return {\n            restrict: 'A',\n            scope: {\n                nboDisabled: '=',\n                nboDisabledType: '@'\n            },\n            link: function( scope, element, attrs ) {\n                function updateStatus(){\n                    if( scope.nboDisabled ){\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).attr( 'disabled', true );\n                        }else{\n                            jQuery(element).addClass( 'nbo-disabled-wrap' );\n                        }\n                    }else{\n                        if( scope.nboDisabledType == 'attr' ){\n                            jQuery(element).removeAttr( 'disabled' );\n                        }else{\n                            jQuery(element).removeClass( 'nbo-disabled-wrap' );\n                        }\n                    }\n                };\n\n                $timeout(function() {\n                    updateStatus();\n                });\n\n                scope.$watch('nboDisabled', function(newValue, oldValue){\n                    if( newValue != oldValue ){\n                        $timeout(function() {\n                            updateStatus();\n                        });\n                    }\n                }, true)\n            }\n        };\n    }).filter('to_trusted', ['$sce', function($sce){\n        return function(text) {\n            var div = document.createElement('div');\n            text += '';\n            div.innerHTML = text;\n            return $sce.trustAsHtml(div.textContent);\n        };\n    }]).filter('svg_trusted', ['$sce', function($sce){\n        return function(text) {\n            return $sce.trustAsHtml(text);\n        };\n    }]).filter('updateDimension', [function(){\n        return function(val, args) {\n            var validate_float = function(input){\n                var output = parseFloat(input);\n                if( isNaN(output) ) output = 0;\n                return output;\n            }\n            if( args.curr ){\n                current_val = validate_float( args.curr ),\n                min_val = validate_float( args.min ),\n                max_val = validate_float( args.max );\n                current_val = ( current_val < min_val ) ? min_val : current_val;\n                current_val = ( max_val != 0 && current_val > max_val ) ? max_val : current_val;\n            }else{\n                current_val = val;\n            }\n            var _scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n            setTimeout(function(){\n                _scope.update_dimensionvalue(args.fid, 'width');\n                _scope.update_dimensionvalue(args.fid, 'height');\n                setTimeout(function(){\n                    _scope.check_valid();\n                } , 300);\n            }, 100);\n            return current_val;\n        };\n    }]);\n            var appEl = document.getElementById('nbo-app-1779018420653');\n        angular.element(function() {\n            angular.bootstrap(appEl, ['nboApp']);\n        });\n        jQuery(document).on( 'update_nbo_options_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.nbd_fields, function(nbd_field, field_id){\n            $scope.nbd_fields[field_id].value = nbd_field.value;\n            $scope.nbd_fields[field_id].sub_value = nbd_field.sub_value;\n        });\n        $scope.check_valid( true, true );\n    });\n    jQuery(document).on( 'update_product_image_from_builder', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        $scope.change_product_image_without_field( data );\n    });\n    jQuery(document).on( 'update_nbo_options_from_advenced_upload', function(e, data){\n        var $scope = angular.element(document.getElementById(nbOption.crtlId)).scope();\n        angular.forEach(data.options, function(option){\n            $scope.nbd_fields[option.field_id].value = option.value;\n        });\n        $scope.check_valid( true, true );\n    });\n    <\/script>\n<\/div><input type=\"hidden\" class=\"nbd-upload\" id=\"nbd-upload-files\" name=\"nbd-upload-files\" value=\"\" \/>\r\n\t\t\t<div class=\"quantity buttons_added simple-type\">\r\n\t\t\t\t<button type=\"button\" value=\"-\" class=\"minus\">-<\/button>\r\n\t\t<input\r\n\t\t\ttype=\"number\"\r\n\t\t\tid=\"quantity_6a09aab4465a4\"\r\n\t\t\tclass=\"input-text qty text\"\r\n\t\t\tstep=\"1\"\r\n\t\t\tmin=\"1\"\r\n\t\t\tmax=\"\"\r\n\t\t\tname=\"quantity\"\r\n\t\t\tvalue=\"1\"\r\n\t\t\taria-label=\"Product quantity\"\r\n\t\t\tsize=\"4\"\r\n\t\t\tplaceholder=\"\"\t\t\tinputmode=\"numeric\" \/>\r\n\t\t<button type=\"button\" value=\"+\" class=\"plus\">+<\/button>\r\n\t\t\t<\/div>\r\n\t\r\n\t\t<button type=\"submit\" name=\"add-to-cart\" value=\"1980\" class=\"single_add_to_cart_button button alt\">Add to cart<\/button>\r\n\r\n\t\t\t<\/form>\r\n\r\n\t\r\n\t\t\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div><!-- .summary -->\r\n\t\t<\/div>\r\n\r\n\t\r\n\t<div class=\"woocommerce-tabs woocommerce-tabs-60rdoco7 resp-htabs\" id=\"product-tab\">\r\n\t\t\t<ul class=\"resp-tabs-list\" role=\"tablist\">\r\n\t\t\t\t\t\t\t<li class=\"description_tab\" id=\"tab-title-description\" role=\"tab\" aria-controls=\"tab-description\">\r\n\t\t\t\t\tDescription\t\t\t\t<\/li>\r\n\t\t\t\t\r\n\t\t<\/ul>\r\n\t\t<div class=\"resp-tabs-container\">\r\n\t\t\t\r\n\t\t\t\t<div class=\"tab-content\" id=\"tab-description\">\r\n\t\t\t\t\t\n\t<h2>Description<\/h2>\n\n<div class=\"wpb-content-wrapper\"><p>[vc_row el_class=&#8221;m-b-md&#8221;][vc_column][vc_column_text css=&#8221;&#8221; css_params=&#8221;&#8221;]The 28\u00d735 cm landscape book is built for impact. Perfect for portfolios or architectural projects, each copy is handcrafted in New Zealand for lasting beauty and durability.[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>\t\t\t\t<\/div>\r\n\r\n\t\t\t\t\t<\/div>\r\n\r\n\t\t\r\n\t\t<script>\r\n\t\t\t( function() {\r\n\t\t\t\tvar porto_init_desc_tab = function() {\r\n\t\t\t\t\t( function( $ ) {\r\n\t\t\t\t\t\tvar $tabs = $('.woocommerce-tabs-60rdoco7');\r\n\r\n\t\t\t\t\t\tfunction init_tabs($tabs) {\r\n\t\t\t\t\t\t\t$tabs.easyResponsiveTabs({\r\n\t\t\t\t\t\t\t\ttype: 'default', \/\/Types: default, vertical, accordion\r\n\t\t\t\t\t\t\t\twidth: 'auto', \/\/auto or any width like 600px\r\n\t\t\t\t\t\t\t\tfit: true,   \/\/ 100% fit in a container\r\n\t\t\t\t\t\t\t\tactivate: function(event) { \/\/ Callback function if tab is switched\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tclosed: false\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!$.fn.easyResponsiveTabs) {\r\n\t\t\t\t\t\t\tvar js_src = \"https:\/\/mythesis.co.nz\/wp-content\/themes\/porto\/js\/libs\/easy-responsive-tabs.min.js\";\r\n\t\t\t\t\t\t\tif (!$('script[src=\"' + js_src + '\"]').length) {\r\n\t\t\t\t\t\t\t\tvar js = document.createElement('script');\r\n\t\t\t\t\t\t\t\t$(js).appendTo('body').on('load', function() {\r\n\t\t\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t\t\t}).attr('src', js_src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinit_tabs($tabs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction goAccordionTab(target) {\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\tvar label = target.attr('aria-controls');\r\n\t\t\t\t\t\t\t\tvar $tab_content = $tabs.find('.resp-tab-content[aria-labelledby=\"' + label + '\"]');\r\n\t\t\t\t\t\t\t\tif ($tab_content.length && $tab_content.css('display') != 'none') {\r\n\t\t\t\t\t\t\t\t\tvar offset = target.offset().top - theme.StickyHeader.sticky_height - theme.adminBarHeight() - 14;\r\n\t\t\t\t\t\t\t\t\tif (offset < $(window).scrollTop())\r\n\t\t\t\t\t\t\t\t\t$('html, body').stop().animate({\r\n\t\t\t\t\t\t\t\t\t\tscrollTop: offset\r\n\t\t\t\t\t\t\t\t\t}, 600, 'easeOutQuad');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$tabs.find('h2.resp-accordion').on('click', function(e) {\r\n\t\t\t\t\t\t\tgoAccordionTab($(this));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} )( window.jQuery );\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif ( window.theme && theme.isLoaded ) {\r\n\t\t\t\t\tporto_init_desc_tab();\r\n\t\t\t\t} else {\r\n\t\t\t\t\twindow.addEventListener( 'load', porto_init_desc_tab );\r\n\t\t\t\t}\r\n\t\t\t} )();\r\n\t\t<\/script>\r\n\t\t\t<\/div>\r\n\r\n\t\r\n\r\n<\/div><!-- #product-1980 -->\r\n\r\n\r\n\t\t\t<\/div>\n\t\t\t<\/div>[\/vc_accordion_tab][\/vc_accordion][\/vc_column][\/vc_row][vc_row wrap_container=&#8221;yes&#8221; el_class=&#8221;my-5&#8243; conditional_render=&#8221;%5B%7B%22value_role%22%3A%22administrator%22%7D%5D&#8221; css=&#8221;.vc_custom_1759098734400{padding-top: 59px !important;padding-bottom: 37px !important;background-color: #edf8ff !important;}&#8221; css_params=&#8221;&#8221;][vc_column offset=&#8221;vc_col-md-4&#8243; conditional_render=&#8221;%5B%7B%22value_role%22%3A%22administrator%22%7D%5D&#8221;][vc_custom_heading text=&#8221;Ready to Bind Your Books?&#8221; font_container=&#8221;tag:h2|font_size:2.2em|text_align:center|line_height:1.6&#8243; use_theme_fonts=&#8221;yes&#8221; font_weight=&#8221;700&#8243; skin=&#8221;secondary&#8221; letter_spacing=&#8221;-.05em&#8221; animation_delay=&#8221;200&#8243; el_class=&#8221;mb-3&#8243; animation_type=&#8221;fadeInUp&#8221; css_params=&#8221;&#8221;][vc_custom_heading text=&#8221;From single copies to large volumes, we deliver professional book binding solutions&#8221; font_container=&#8221;tag:p|font_size:1.2em|text_align:center|color:%23777777|line_height:26px&#8221; use_theme_fonts=&#8221;yes&#8221; font_weight=&#8221;400&#8243; letter_spacing=&#8221;0px&#8221; animation_delay=&#8221;400&#8243; el_class=&#8221;custom-font1 mb-3&#8243; animation_type=&#8221;fadeInUp&#8221; css_params=&#8221;&#8221;][\/vc_column][vc_column el_class=&#8221;ps-lg-5&#8243; conditional_render=&#8221;%5B%7B%22value_role%22%3A%22administrator%22%7D%5D&#8221; offset=&#8221;vc_col-md-8&#8243;][vc_row_inner el_class=&#8221;mt-5 mt-lg-0&#8243;][vc_column_inner width=&#8221;1\/2&#8243;]<div class=\"porto-sicon-box mb-5 mb-md-0  wpb_custom_8f5e6c6c426bf7d9896632c697cf4877 style_1 top-icon\" data-appear-animation=\"fadeInUp\" data-appear-animation-delay=\"400\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-sicon-img  porto-icon-9f5d1cfb45d27d96b50bf473aebba227\" style=\"font-size: 70px;\"><img loading=\"lazy\" decoding=\"async\" class=\"img-icon\" alt=\"\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/seo3_icon_9.svg\" width=\"0\" height=\"0\" \/><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"margin-bottom:-2px;\">Leatherette Bound<\/h3><\/div> <!-- header --><\/div><!-- porto-sicon-box -->[vc_btn title=&#8221;Book Now&#8221; css_params=&#8221;&#8221; link=&#8221;url:https%3A%2F%2Fmythesis.co.nz%2Findex.php%2Fproduct%2Fleatherette-hardcover%2F|title:Hard%20Bound%20Thesis&#8221;][\/vc_column_inner][vc_column_inner width=&#8221;1\/2&#8243;]<div class=\"porto-sicon-box my-5 my-md-0  wpb_custom_8f5e6c6c426bf7d9896632c697cf4877 style_1 top-icon\" data-appear-animation=\"fadeInUp\" data-appear-animation-delay=\"200\"><div class=\"porto-sicon-top\"><div class=\"porto-just-icon-wrapper porto-sicon-img  porto-icon-9f5d1cfb45d27d96b50bf473aebba227\" style=\"font-size: 70px;\"><img loading=\"lazy\" decoding=\"async\" class=\"img-icon\" alt=\"\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/seo3_icon_8.svg\" width=\"0\" height=\"0\" \/><\/div><\/div><div class=\"porto-sicon-header\"><h3 class=\"porto-sicon-title\" style=\"margin-bottom:-2px;\">Buckram Bound<\/h3><\/div> <!-- header --><\/div><!-- porto-sicon-box -->[vc_btn title=&#8221;Bind Now&#8221; css_params=&#8221;&#8221; link=&#8221;url:https%3A%2F%2Fmythesis.co.nz%2Findex.php%2Fproduct%2Fimage-leatherette-hardcover%2F|title:Limp%20Bound%20Thesis&#8221;][\/vc_column_inner][\/vc_row_inner]<div class=\"porto-gallery has-ccols ccols-2 has-ccols-spacing ccols-md-3 ccols-lg-4 wpb_custom_8febd08a0ef8cbad916430a7519ab777 porto-gallery-grid align-items-center m-t-md pt-3 text-center\" data-appear-animation=\"fadeInUp\" data-appear-animation-delay=\"800\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1362\" height=\"1024\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples.png\" class=\"attachment-full size-full\" alt=\"Hardbound thesis books in red, blue, and green covers \u2013 MyThesis.co.nz New Zealand binding service\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples.png 1362w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-1024x770.png 1024w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-768x577.png 768w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-463x348.png 463w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-640x480.png 640w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-400x300.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-367x276.png 367w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2025\/09\/nz-thesis-binding-samples-600x451.png 600w\" sizes=\"auto, (max-width: 1362px) 100vw, 1362px\" \/><\/figure><figure><img loading=\"lazy\" decoding=\"async\" width=\"798\" height=\"564\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound.png\" class=\"attachment-full size-full\" alt=\"New Zealand Thesis Binding Service with 24 Hour Turnaround\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound.png 798w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound-768x543.png 768w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound-640x452.png 640w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound-400x283.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound-367x259.png 367w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/soft-bound-600x424.png 600w\" sizes=\"auto, (max-width: 798px) 100vw, 798px\" \/><\/figure><figure><img loading=\"lazy\" decoding=\"async\" width=\"592\" height=\"598\" src=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-27-at-23.00.38.png\" class=\"attachment-full size-full\" alt=\"New Zealand Hard Thesis Binding Service with 24 Hour Turnaround\" srcset=\"https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-27-at-23.00.38.png 592w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-27-at-23.00.38-400x404.png 400w, https:\/\/mythesis.co.nz\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-27-at-23.00.38-367x371.png 367w\" sizes=\"auto, (max-width: 592px) 100vw, 592px\" \/><\/figure><figure><img decoding=\"async\" class=\"img-responsive\" src=\"https:\/\/mythesis.co.nz\/wp-content\/plugins\/porto-functionality\/shortcodes\/assets\/images\/placeholder.jpg\" \/><\/figure><\/div>[\/vc_column][\/vc_row][vc_column el_class=&#8221;mb-3 mb-xl-0&#8243;][\/vc_column]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[vc_row wrap_container=&#8221;yes&#8221; full_height=&#8221;yes&#8221; is_section=&#8221;yes&#8221; section_skin=&#8221;parallax&#8221; remove_margin_top=&#8221;yes&#8221; remove_margin_bottom=&#8221;yes&#8221; remove_border=&#8221;yes&#8221; el_id=&#8221;section_6&#8243;][vc_column][vc_btn title=&#8221;Volume &amp; Custom Solutions&#8221; style=&#8221;outline&#8221; shape=&#8221;round&#8221; color=&#8221;sky&#8221; align=&#8221;center&#8221; css_params=&#8221;&#8221;][vc_empty_space css_params=&#8221;&#8221;][vc_custom_heading text=&#8221;From custom covers to bulk volume orders \u2014 crafted locally with care and precision.&#8221; font_container=&#8221;tag:h4|font_size:21|text_align:center|line_height:1&#8243; use_theme_fonts=&#8221;yes&#8221; skin=&#8221;primary&#8221; el_class=&#8221;m-b-xl&#8221; css_params=&#8221;&#8221;][vc_empty_space height=&#8221;64px&#8221; css_params=&#8221;&#8221;][vc_row_inner el_class=&#8221;mb-5&#8243;][vc_column_inner offset=&#8221;vc_col-md-7&#8243;][vc_custom_heading text=&#8221; Each book is handcrafted in premium leatherette or buckram cloth, blending timeless [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1717","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Professional Book Binding &amp; Printing NZ | Custom Hardcover &amp; Paperback Solutions<\/title>\n<meta name=\"description\" content=\"Premium Book Binding and printing services specializing in Custom Hardcover &amp; Paperback solutions for authors across New Zealand. We offer fast nationwide delivery and quality guarantee.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Professional Book Binding &amp; Printing NZ | Custom Hardcover &amp; Paperback Solutions\" \/>\n<meta property=\"og:description\" content=\"Premium Book Binding and printing services specializing in Custom Hardcover &amp; Paperback solutions for authors across New Zealand. We offer fast nationwide delivery and quality guarantee.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/\" \/>\n<meta property=\"og:site_name\" content=\"Professional Thesis Binding Auckland | 24hr Urgent | Uni-Approved | MyThesis\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-01T10:26:10+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mythesis.co.nz\\\/index.php\\\/book-binding-and-printing\\\/\",\"url\":\"https:\\\/\\\/mythesis.co.nz\\\/index.php\\\/book-binding-and-printing\\\/\",\"name\":\"Professional Book Binding & Printing NZ | Custom Hardcover & Paperback Solutions\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mythesis.co.nz\\\/#website\"},\"datePublished\":\"2025-09-28T22:33:51+00:00\",\"dateModified\":\"2025-11-01T10:26:10+00:00\",\"description\":\"Premium Book Binding and printing services specializing in Custom Hardcover & Paperback solutions for authors across New Zealand. We offer fast nationwide delivery and quality guarantee.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mythesis.co.nz\\\/index.php\\\/book-binding-and-printing\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/mythesis.co.nz\\\/index.php\\\/book-binding-and-printing\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mythesis.co.nz\\\/index.php\\\/book-binding-and-printing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mythesis.co.nz\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"..\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mythesis.co.nz\\\/#website\",\"url\":\"https:\\\/\\\/mythesis.co.nz\\\/\",\"name\":\"Professional Thesis Binding Auckland | 24hr Urgent | Uni-Approved | MyThesis\",\"description\":\"Specialists in Thesis Binding, Book Binding and Book Repairs, Auckland, New Zealand\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/mythesis.co.nz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Professional Book Binding & Printing NZ | Custom Hardcover & Paperback Solutions","description":"Premium Book Binding and printing services specializing in Custom Hardcover & Paperback solutions for authors across New Zealand. We offer fast nationwide delivery and quality guarantee.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/","og_locale":"en_US","og_type":"article","og_title":"Professional Book Binding & Printing NZ | Custom Hardcover & Paperback Solutions","og_description":"Premium Book Binding and printing services specializing in Custom Hardcover & Paperback solutions for authors across New Zealand. We offer fast nationwide delivery and quality guarantee.","og_url":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/","og_site_name":"Professional Thesis Binding Auckland | 24hr Urgent | Uni-Approved | MyThesis","article_modified_time":"2025-11-01T10:26:10+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/","url":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/","name":"Professional Book Binding & Printing NZ | Custom Hardcover & Paperback Solutions","isPartOf":{"@id":"https:\/\/mythesis.co.nz\/#website"},"datePublished":"2025-09-28T22:33:51+00:00","dateModified":"2025-11-01T10:26:10+00:00","description":"Premium Book Binding and printing services specializing in Custom Hardcover & Paperback solutions for authors across New Zealand. We offer fast nationwide delivery and quality guarantee.","breadcrumb":{"@id":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/mythesis.co.nz\/index.php\/book-binding-and-printing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/mythesis.co.nz\/"},{"@type":"ListItem","position":2,"name":".."}]},{"@type":"WebSite","@id":"https:\/\/mythesis.co.nz\/#website","url":"https:\/\/mythesis.co.nz\/","name":"Professional Thesis Binding Auckland | 24hr Urgent | Uni-Approved | MyThesis","description":"Specialists in Thesis Binding, Book Binding and Book Repairs, Auckland, New Zealand","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mythesis.co.nz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/pages\/1717","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/comments?post=1717"}],"version-history":[{"count":147,"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/pages\/1717\/revisions"}],"predecessor-version":[{"id":2296,"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/pages\/1717\/revisions\/2296"}],"wp:attachment":[{"href":"https:\/\/mythesis.co.nz\/index.php\/wp-json\/wp\/v2\/media?parent=1717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}