; User: Rubys-shopline https://www.rubys.com.tw/
; type: Shopline

; Tags
currencyCode=TWD
tagId=rubys
tag_gtag_enabled=true
tag_gtag_id="GTM-TW79K5B"
tag_gtag_gaId="G-C2HNKLYPCW"
tag_gtag_bCookieIndex=1
tag_gtag_lazeInfoIndex=2
tag_gtag_downstreams[]=mp
tag_gtag_downstreams[]=official

; Router
router_rules[]='/*'
router_pages[]='all'

router_rules[]='/users/sign_in*'
router_pages[]='officialMember'

router_rules[]='/users/sign_in*'
router_pages[]='shoppingMember'

router_rules[]='/categories/*'
router_pages[]='category'
; 新品, 熱銷, 特別企劃 ，無 breadcrumb
router_rules[]='/pages/*'
router_pages[]='categoryByPages'

router_rules[]='/products/*'
router_pages[]='detail'

router_rules[]='/cart*'
router_pages[]='cart'

router_rules[]='/checkout*'
router_pages[]='checkout'

router_rules[]="/products*"
router_pages[]=search

router_rules[]="/products"
router_pages[]='impressions'

router_rules[]='/orders/*'
router_pages[]='orders'

; Page
;   get login user data
page_all_scripts[]=getUid
page_all_params[]=[]
;   include popupAddToCart
page_all_secs[]=addToCartInList
;   get category from previous page
page_all_secs[]=clickProduct
page_all_secs[]=clickRemoveCart
page_all_secs[]=clickCartIcon
page_all_secs[]=clickCheckout
;   not specific path because of redirecting by FB/LINE
page_all_scripts[]=completeRegistrationSend

page_officialMember_secs[]=officialMemberSignUp
page_shoppingMember_secs[]=shoppingMemberSignUp

;   category not in h1, get category from breadcrumb
page_category_scripts[]=initCategory
page_category_params[]=[]

;   category not in h1, get category from title
page_categoryByPages_scripts[]=initcategoryByPages
page_categoryByPages_params[]=[]

;   get category from breadcrumb
page_detail_scripts[]=initDetail
page_detail_params[]=[]
page_detail_secs[]=addToCartInDetail
page_detail_secs[]=buyNowFromDetail

; cart
page_cart_scripts[]=checkoutLib
page_cart_params[]=[]
page_cart_scripts[]=initCheckoutFromCart
page_cart_params[]=[]
page_cart_secs[]=clickConfirmCheckout
page_cart_secs[]=removeFromCartInCheckout

; checkout
page_checkout_scripts[]=checkoutLib
page_checkout_params[]=[]
page_checkout_scripts[]=initCheckoutFromConfirm

page_search_scripts[]=initSearch
page_search_params[]=[]

;   get category from title
page_impressions_scripts[]=initCategory
page_impressions_params[]=[]

page_orders_scripts[]=purchase
page_orders_params[]=[]

; Section
sec_officialMemberSignUp_selects[]='form button#submit-btn'
sec_officialMemberSignUp_types[]=delegate
sec_officialMemberSignUp_scripts[]=officialMemberSignUp
sec_officialMemberSignUp_params[]=[]

sec_shoppingMemberSignUp_selects[]='div[ng-controller*="Reg"] .btn-line-login'
sec_shoppingMemberSignUp_types[]=delegate
sec_shoppingMemberSignUp_scripts[]=shoppingMemberSignUp
sec_shoppingMemberSignUp_params[]=["line"]

sec_shoppingMemberSignUp_selects[]='div[ng-controller*="Reg"] .btn-facebook-login'
sec_shoppingMemberSignUp_types[]=delegate
sec_shoppingMemberSignUp_scripts[]=shoppingMemberSignUp
sec_shoppingMemberSignUp_params[]=["facebook"]

; click from pages, get category from initcategoryByPages（title），可能與 initDetail 拿到的不同（breadcrumb）
sec_clickProduct_selects[]=".product-item"
sec_clickProduct_types[]="click"
sec_clickProduct_scripts[]="clickProduct"
sec_clickProduct_params[]=[]

; click from categories, get category from initcategory
sec_clickProduct_selects[]=".Product-item"
sec_clickProduct_types[]="click"
sec_clickProduct_scripts[]="clickProduct"
sec_clickProduct_params[]=[]

sec_addToCartInList_selects[]=".btn-add-to-cart"
sec_addToCartInList_types[]="delegate"
sec_addToCartInList_scripts[]="addToCartInList"
sec_addToCartInList_params[]=[]

sec_addToCartInDetail_selects[]="button#btn-add-to-cart"
sec_addToCartInDetail_types[]="click"
sec_addToCartInDetail_scripts[]="addToCartInDetail"
sec_addToCartInDetail_params[]=[]

sec_addToCartInDetail_selects[]="#btn-main-checkout"
sec_addToCartInDetail_types[]="click"
sec_addToCartInDetail_scripts[]="addToCartInDetail"
sec_addToCartInDetail_params[]=[]

; have addOn
sec_addToCartInDetail_selects[]="button#btn-addon-checkout"
sec_addToCartInDetail_types[]="click"
sec_addToCartInDetail_scripts[]="addToCartInDetail"
sec_addToCartInDetail_params[]=[]

; btn change to fixed position when scroll down(right) or mobile(bottom), include addon btn
sec_addToCartInDetail_selects[]=".btn-cart-fixed.js-btn-cart-fixed"
sec_addToCartInDetail_types[]="delegate"
sec_addToCartInDetail_scripts[]="addToCartInDetailFixedBtn"
sec_addToCartInDetail_params[]=[]

; buynow
;   laptop
sec_buyNowFromDetail_selects[]="button.btn-buy-now"
sec_buyNowFromDetail_types[]="click"
sec_buyNowFromDetail_scripts[]="buyNow"
sec_buyNowFromDetail_params[]=[]
;   fixed-top & mobile-bottom
sec_buyNowFromDetail_selects[]=".btn-cart-fixed.btn-buy-now"
sec_buyNowFromDetail_types[]="click"
sec_buyNowFromDetail_scripts[]="buyNow"
sec_buyNowFromDetail_params[]=[]

sec_clickRemoveCart_selects[]=".cart-item > .remove"
sec_clickRemoveCart_types[]="delegate"
sec_clickRemoveCart_scripts[]="clickRemoveCart"
sec_clickRemoveCart_params[]=[]

sec_clickCartIcon_selects[]=".CartPanel-toggleButton"
sec_clickCartIcon_types[]="click"
sec_clickCartIcon_scripts[]="clickCartIcon"
sec_clickCartIcon_params[]=[]
sec_clickCartIcon_selects[]=".CartPanel-toggleButton"
sec_clickCartIcon_types[]="touchstart"
sec_clickCartIcon_scripts[]="clickCartIcon"
sec_clickCartIcon_params[]=[]

sec_clickCheckout_selects[]="#btn-checkout"
sec_clickCheckout_types[]="click"
sec_clickCheckout_scripts[]="clickCheckout"
sec_clickCheckout_params[]=[]

sec_clickConfirmCheckout_selects[]=".order-summary .btn-success"
sec_clickConfirmCheckout_types[]=click
sec_clickConfirmCheckout_scripts[]=clickConfirmCheckout
sec_clickConfirmCheckout_params[]=[]

sec_removeFromCartInCheckout_selects[]=".btn-confirm"
sec_removeFromCartInCheckout_types[]="click"
sec_removeFromCartInCheckout_scripts[]="removeFromCartInCheckout"
sec_removeFromCartInCheckout_params[]=[]

; Script
;   get uid when login
;   get productId when mouseover for clickRemoveCart
; checked
script_getUid="
<script>
var g = window.i13n;
var query = g.query;
var delegate = g.delegate;
var memberIcon = query.one('a[href*="/users/"]');
if (memberIcon) {
  var memberLink = query.ancestor(memberIcon, 'a');
  if (memberLink && memberLink.href) {
    var hrefs = memberLink.href.split('/');
    var lastHref = hrefs.slice(-1)[0];
    if (lastHref==='edit') {
      var uid = hrefs.slice(-2)[0];
      g.dispatch({ uid: uid });
    }
  }
}
var dCart = query.one('#cart-panel .cart-items');
if (dCart) {
  delegate(
    dCart, 
    'mouseover',
    ".remove",
    function(e){ 
      var t = e.currentTarget;    
      var cartItem = query.ancestor(t, ".cart-item");
      var cartLink = query.from(cartItem).one("a");

      g.lastProdId = cartLink && cartLink.href.split("/")[4];
    }
  );
}
</script>
"
; checked
script_shoppingMemberSignUp="
<script>
var g = window.i13n;
var get = g.get;
g.dispatch('action', {
  wait: 5,
  lazyKey: 'CompleteRegistration',
  i13nCb: function (e, I13N, params) {
    I13N.label = { regType: get(params, [0]) };
    return I13N;
  },
});
</script>
"
; checked
script_officialMemberSignUp="
<script>
var g = window.i13n;
var get = g.get;
g.dispatch('action', { 
  wait: 5,
  lazyKey: 'CompleteRegistration',
  i13nCb: function(e, I13N) {
    var t = e.currentTarget;
    var email = get(e, ["currentTarget", "form", "email", "value"]);
    var phone = get(e, ["currentTarget", "form", "mobilePhone", "value"]);
    I13N.label = {
      ...(email && { email }),
      ...(phone && { phone })
    };
    return I13N;
  },
});
</script>
"
; 
script_completeRegistrationSend="
<script>
var g = window.i13n;

let userId = g.getUserId();
if (!userId) {
  return false;
}
g.dispatch({ uid: userId });

g.dispatch("action", {
  withLazy: "CompleteRegistration",
  I13N: {
    action: "CompleteRegistration",
  },
  i13nCb: function (e, I13N) {
    label = I13N.label;
    if (label) {
      return I13N;
    }
  },
});
</script>
"
; checked
script_initCategory="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var getNum = g.getNum;
var objectToArray = g.objectToArray;
var parseJson = g.parseJson;
var getProducts = function() {
  var arr = {};
  var categorys = query.all('.ProductList-breadcrumb .Label');
  var category = text(categorys && categorys.length && categorys.slice(-1)[0]);
  var productDoms = query.all('.Product-item');
  productDoms.forEach(function(product, key){
    var data = product.getAttribute('ga-product');
    data = parseJson(data);
    var id = data.id;
    var name = data.title;
    var price = getNum(product.querySelector(".Label-price")); 
    arr[id] = {
      name: name,
      id: id,
      category: category,
      position: key,
      price: price,
    };
  });
  return arr;
};
var arrP = getProducts();
g.dispatch({
  i13nPage: {
    impressions: objectToArray(arrP),
  }
});
</script>
"
; checked
script_initcategoryByPages="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var getNum = g.getNum;
var objectToArray = g.objectToArray;
var parseJson = g.parseJson;
var getProducts = function() {
  var arr = {};
  var productDoms = query.all("product-item > a");
  var category = text(query.one("title"));
  productDoms.forEach(function(product, key){
    var data = product.getAttribute("ga-product");
    data = parseJson(data);
    var id = data.id;
    var name = data.title;
    var price = getNum(product.querySelector(".price"));
    arr[id] = {
      name,
      id,
      category,
      position: key,
      price,
    };
  });
  return arr;
};
var arrP = getProducts();
g.dispatch({
  i13nPage: {
    impressions: objectToArray(arrP),
  }
});
</script>
"
; checked
; get category from initcategory
script_clickProduct="
<script>
var g = window.i13n;
var query = g.query;
var parseJson = g.parseJson;
g.dispatch('action', { 
  wait: 0,
  I13N: {
    action: 'ClickProduct'
  },
  i13nCb: function(e, I13N) {
    var ct = e.currentTarget;
    var t = e.target;
    var addToCartClassName = 'btn-add-to-cart';
    var isAddToCart = query.ancestor(t, '.'+addToCartClassName);
    if (isAddToCart || -1 !== t.className.indexOf(addToCartClassName)) {
      return false;
    }
    var pDom = ct.querySelector("product-item a") || ct;
    var data = pDom.getAttribute('ga-product');
    data = parseJson(data);
    I13N.products = [{id: data.id}];
    return I13N;
  },
});
</script>
"
; checked
script_addToCartInList="
<script>
var g = window.i13n;
var query = g.query;
var parseJson = g.parseJson;
var text = g.text;
var getElValue = g.getElValue;
var getNum = g.getNum;
var toMap = g.toMap;
var storeCbParams = g.storeCbParams;
var execScript = g.execScript;
var pId;
var pName;
var salePrice;
var normalPrice;

var callbackAddToCartInPopUp = function(e) {
    var t = e.currentTarget;
    var pDom = query.ancestor(t, ".product-info");
    var quantity = getElValue("input[type='text']", pDom);

    var selectionDoms = query.from(pDom).all(".variation-label--selected");
    var variants = selectionDoms.map(v => text(v));
    // if add from homepage without initCategory, can not get otehr p-info
    g.dispatch("action", {
      I13N: {
        action: "AddToCart",
        products: [{
          id: pId,
          name: pName,
          price: salePrice ? salePrice : normalPrice,
          variant: (variants || []).join(","),
          quantity
        }],
      }
    });
};
g.dispatch('action', {
  delay: 2500,
  I13N: {
    action: 'AddToCart'
  },
  i13nCb: function(e, I13N, p) {
    var t = e.currentTarget || p.currentTarget;
    var data;
    var pDom = query.ancestor(t, "a.quick-cart-item") || query.from(t).one("a.quick-cart-item");
    var popUpDom = query.one(".btn-quick-cart-add-to-cart");

    if (!pDom) return

    data = parseJson(pDom.getAttribute("ga-product"));
    pId= data.id;
    pName = data.title;
    salePrice = getNum(query.from(pDom).one(".price-sale"));
    normalPrice = getNum(query.from(pDom).one(".global-primary.price"));
    // get other p-info if initCategory

    if (popUpDom) {
      popUpDom.addEventListener('click', callbackAddToCartInPopUp);
      
      // buyNow
      var modal = query.one(".modal-content");
      var queryModal = query.from(modal);
      queryModal.one("button.btn-buy-now").addEventListener("click", (e) => {
        var quantity = getNum(getElValue(queryModal.one("input[type='text']")));
        var selectionDoms = queryModal.all(".variation-label--selected");
        var variants = selectionDoms.map(v => text(v));
        var pInfo = {
          id: pId,
          name: pName,
          price: salePrice || normalPrice,
        };

        storeCbParams({
          quantity,
          variants,
          ...pInfo
        }, e);
        execScript("execAddToCartWithWait");
        return;
      })

      return;
    }

    // addToCart directly without select quantity and variant
    I13N.products = [{
      id: pId,
      name: pName,
      price: salePrice ? salePrice : normalPrice,
      quantity: 1
    }];
    return I13N;
  },
});
</script>
"
; checked
script_initDetail="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var getNum = g.getNum;
var allScripts = query.all('script');
var reg = /(\{)(\\)?("Product ID)(\\)?("\:)(\\)?(")([^"\\]*)/;
var id;
allScripts.some(function(s){
  var html = s.innerHTML;
  if (-1 !== html.indexOf('Product ID')) {
    var result = reg.exec(html);
    if (result && result[8]) {
      id = result[8];
    }
    return true;
  } else {
    return false;
  }
});
var name = text(query.one('.Product-title'));
var price = getNum(query.one('.price'));
var categorys = query.all('.Product-breadcrumb .Label');
var category = text(categorys && categorys.length && categorys.slice(-1)[0]);

var pInfo = {
  id: id,
  name: name,
  price: price,
  category: category,
};

g.dispatch({
  pInfo: pInfo, 
  i13nPage: {
    detailProducts: [pInfo]
  }
});
</script>
"
; checked
script_addToCartInDetail="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var get = g.get;
var getElValue = g.getElValue;
g.dispatch("action", {
  I13N: {
    action: "AddToCart"
  },
  i13nCb: function(e, I13N, p, state) {
    var t = e.currentTarget || p.currentTarget;
    var pDom = query.ancestor(t, ".ProductDetail-product-info");
    var pInfo = get(state.get("pInfo"));
    var quantity = getElValue("input[type='text']", pDom);
    var pId = pInfo.id;

    var selectionDoms = query.from(pDom).all(".variation-label--selected");
    var variants = selectionDoms.map(v => text(v));

    I13N.products = [{
      id: pId,
      quantity: quantity,
      variant: (variants || []).join(","),
    }]
    return I13N;
  },
});
</script>
"
; checked
script_clickRemoveCart="
<script>
var g = window.i13n;
var query = g.query

if (!g.lastProdId) return;

g.dispatch('action', {
  I13N: {
    action: 'RemoveFromCart',
  },
  i13nCb: function(e, I13N, params) {
    I13N.products = [{
      id: g.lastProdId,
    }];
    return I13N;
  }
});
</script>
"
script_addToCartInDetailFixedBtn="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var get = g.get;
var getElValue = g.getElValue;
g.dispatch('action', {
  I13N: {
    action: "AddToCart"
  },
  i13nCb: function(e, I13N, p, state) {
    var t = e.currentTarget || p.currentTarget;
    var pInfo = get(state.get("pInfo"));
    var pId = pInfo.id;

    var pDom = query.one(":not(.ng-hide) > .ProductDetail-product");
    var quantity = getElValue("input[type='text']", pDom);

    var selectionDoms = query.from(pDom).all(".variation-label--selected");
    var variants = selectionDoms.map(v => text(v));

    I13N.products = [{
        id: pId,
        variant: (variants || []).join(","),
        quantity: quantity
    }];
    return I13N;
  },
});
</script>
"
script_buyNow="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var get = g.get;
var getElValue = g.getElValue;
var storeCbParams = g.storeCbParams;
var execScript = g.execScript;

g.dispatch("action", {
  i13nCb: function(e, I13N, p, state) {
    var pDom = query.one(".ProductDetail-product-info.js-product-info");
    var pInfo = get(state.get("pInfo"));
    var quantity = getElValue("input[type='text']", pDom);
    var selectionDoms = query.from(pDom).all(".variation-label--selected");
    var arrText = selectionDoms.map(v => text(v));

    storeCbParams({
      quantity,
      variants: arrText,
      ...pInfo
    }, e);
    execScript("execAddToCartWithWait");
    return
  },
});
</script>
"
script_execAddToCartWithWait="
<script>
var g = window.i13n;
g.dispatch("action", {
  wait: 0,
  i13nCb: function(e, I13N, p, state) {
    p = p || {}; 
    I13N.action = p.action || "AddToCart";
    I13N.products = [{
      id: p.id,
      name: p.name,
      price: p.price,
      position: p.position,
      category: p.category,
      quantity: p.quantity,
      variant: (p.variants || []).join(",")
    }];
    return I13N;
  },
});
</script>
"
; checked
script_checkoutLib="
<script>
var g = window.i13n;
var query = g.query;
var text = g.text;
var getNum = g.getNum;
var getElValue = g.getElValue;

g.getCheckoutProducts = function() {
  var products = [];
  var pRows = query.all('section.shopping-cart .table-row.row'); 
  if (pRows && pRows.length) {
    pRows.forEach(function(row){
      var name = text(row.querySelector(".description")); 
      var id = row.getAttribute("product-id");
      var price = getNum(row.querySelector(".price-label"));
      var quantity = getElValue('.item-quantity input', row);
      if (quantity == null) {
        quantity = getNum(row.querySelector(".item-quantity"));
      }
      products.push({
        name: name,
        id: id,
        price: price,
        quantity: quantity
      });
    });
  }
  return products;
};
</script>
"
; checked
script_clickCartIcon="
<script>
var g = window.i13n;
g.dispatch('action', {
  I13N: {
    action: 'ClickCartIcon',
    stepNo: 1,
  }
});
</script>
"
; checked
script_clickCheckout="
<script>
var g = window.i13n;
g.dispatch('action', {
  wait: 0,
  I13N: {
    action: 'ClickCheckout',
    stepNo: 2,
  }
});
</script>
"
; checked
script_initCheckoutFromCart="
<script>
var g = window.i13n;
var products = g.getCheckoutProducts(); 
var query = g.query;
var delegate = g.delegate;

g.dispatch({
  i13nPage: {
    stepNo: 3,
    products: products
  }
});

var checkoutCart = query.one(".shopping-cart .cart-items");
if (checkoutCart) {
  delegate(
    checkoutCart, 
    'mouseover',
    ".btn-remove-cart-item",
    function(e){ 
      var t = e.currentTarget;    
      var cartItem = query.ancestor(t, ".cart-item");
      var cartLink = query.from(cartItem).one("a");
      g.lastProdId = cartLink.href.split("/")[4];
    }
  );
}
</script>
"
; checked
script_clickConfirmCheckout="
<script>
var g = window.i13n;
g.dispatch('action', {
  wait: 0,
  I13N: {
    stepNo: 4,
    action: 'ClickConfirmCheckout'
  },
  i13nCb: function(e, I13N, p, state) {
    I13N.products = g.getCheckoutProducts(); 
    return I13N;
  },
});
</script>
"
; checked
script_initCheckoutFromConfirm="
<script>
var g = window.i13n;
var query = g.query;
var getNum = g.getNum;

var products = g.getCheckoutProducts(); 
g.dispatch({
  i13nPage: {
    stepNo: 5,
    products: products
  }
});

var getShip = function() {
  var dom = query.one('section.delivery-form .pull-right');
  if (dom) {
    return getNum(dom);
  }
};
var getTax = function() {
  var dom = query.one('section.payment-form .pull-right');
  if (dom) {
    return getNum(dom);
  }
};

var revenue = getNum(query.one('#summary-header-total-price'));
var shipping = getShip();
var tax = getTax();

g.dispatch('action', {
  wait: 99,
  stop: true,
  lazyKey: 'Purchase',
  I13N: {
    products: products,
    revenue: revenue,
    shipping: shipping,
    tax: tax,
  },
})
</script>
"
; checked
script_purchase="
<script>
var g = window.i13n;
var getRandomId = g.getRandomId;
var query = g.query;
var getNum = g.getNum;
g.dispatch('action', {
  withLazy: 'Purchase',
  I13N: {
    action: 'Purchase'
  },
  i13nCb: function(e, I13N, p, state) {
    products = I13N.products
    if (products) {
      var getShoplineOrderId = function() {
        var text = g.text;
        var dom = query.one('.confirm-message');
        if (dom) {
          var domText = text(dom);
          var numReg = /(\-)?(\d+)(\.)?(\d+)?/g;
          var matchId = domText.replace(',', '').match(numReg)[0];
          if (matchId) {
            return matchId
          } else {
            return getRandomId()
        }
      }
    };
    I13N.purchaseId = getShoplineOrderId()
    return I13N;
    } else {
      return false
    }
    
  },
});
</script>
"
; checked
script_initSearch="
<script>
var g = window.i13n;
var getUrl = g.getUrl;
var keyword = getUrl('query');
if (keyword) {
  g.dispatch('action', {
    I13N: {
      action: 'Search',
      label: {
        search_string: keyword  
      }
    },
  });
}
</script>
"
; checked
script_removeFromCartInCheckout="
<script>
var g = window.i13n;
var query = g.query

if (!g.lastProdId) return;

g.dispatch('action', {
  I13N: {
    action: 'RemoveFromCart',
  },
  i13nCb: function(e, I13N, params) {
    I13N.products = [{
      id: g.lastProdId
    }];
    return I13N;
  }
});
</script>
"
