﻿function amazonECS() {
  this.itemsNode = null
  this.items = []
  this.cartid = null
  this.hmac = null
  this.cart_asin = []
  this.cartElem = null
  this.carParent = null
  this.purchaseUrl = null
  this.assoicateTag = "thebeaquofor-20"
  var _this = this
  var xmlDoc = null
  function iserror(xmlDoc) {
    function clearmsg() {
      app.sc.msgbox.style.display = 'none'
    }
    if ((errs = xmlDoc.getElementsByTagName('Errors')).length) {
      setTimeout(clearmsg, 8000);
      app.msgbox((em = errs[0].getElementsByTagName('Message')[0].childNodes[0].nodeValue) ? em : 'Amazon Shopping Cart Error.')
      return true
    } else return false
  }
  this.getItemID = function(asin) {
    for (var i in this.items) {
      if (this.items[i].ASIN == asin) return this.items[i].ID
    }
  }

  this.cart2HTML = function(xml) {
    var items = document.createElement('div')
    this.additem = function(qty, pn, prc, tot, cid, asin) {
      function qtychgd(e) {
        var evt = BC.getEventObject(e)
        _this.modifyCart(buildCart, evt.srcElement.parentNode.parentNode.getAttribute('itemid'), evt.srcElement.value)
      }
      var itm = document.createElement('div')
      itm.className = 'item'
      if (!cid) itm.style.background = 'RGB(240,240,240)'
      this.cart_asin.push(asin)
      itm.setAttribute('itemid', cid)
      if (cid) {
        var dimg = document.createElement('img')
        dimg.setAttribute('asin', asin)
        dimg.onclick = _this.delitem
        dimg.src = 'images/delete.png'
        dimg.className = 'delbut'
        dimg.title = 'Delete Item'
        itm.appendChild(dimg)
      }
      //product name
      elem = document.createElement('span')
      elem.className = 'prodname'
      if (!cid) {
        elem.style.cssText = 'font-weight:bold; text-align:center; margin-left:22px;border-left-width:0px;'
      }
      elem.title = pn
      elem.innerHTML = pn
      itm.appendChild(elem)
      //price
      elem = document.createElement('span')
      elem.className = 'price'
      if (!cid) elem.style.cssText = 'font-weight:bold; text-align:center;'
      elem.innerHTML = prc
      itm.appendChild(elem)
      // quantity
      var elem = document.createElement(cid ? 'select' : 'span')
      var lbqty = function(avail) {
        for (var i = 0; i < avail; i++) {
          var opt = document.createElement('option')
          opt.value = i + 1
          opt.innerHTML = i + 1
          elem.appendChild(opt)
        }
      }
      if (!cid) {
        elem.className = 'qty'
        elem.style.cssText = 'background:RGB(240,240,240);padding:3px 0;text-align:center;'
        elem.innerHTML = qty
        itm.appendChild(elem)
      } else {
        elem.tabIndex = i + 1
        elem.onchange = qtychgd
        var avail = this.items[this.getItemID(asin)].totalNew
        var dq = document.createElement('div')
        dq.className = 'qty'
        dq.style.cssText = 'margin: -1px 0;'
        lbqty(parseInt(avail) + (parseInt(avail) ? 0 : 1))
        elem.value = qty
        dq.appendChild(elem)
        itm.appendChild(dq)
      }
      //item total
      elem = document.createElement('span')
      elem.className = 'total'
      if (!cid) elem.style.cssText = 'font-weight:bold; text-align:center;padding-bottom:3px;padding-top:3px;'
      elem.innerHTML = tot
      itm.appendChild(elem)

      items.appendChild(itm)
    }
    var type1Val = function(xitm, name) {
      return xitm.getElementsByTagName(name)[0].childNodes[0].nodeValue
    }
    var type2Val = function(xitm, name) {
      return xitm.getElementsByTagName(name)[0].lastChild.childNodes[0].nodeValue
    }
    this.additem('Quantity', 'Product Name', 'Price', 'Total', null, null)
    this.cart_asin = []
    var ci = xml.getElementsByTagName('CartItem')
    for (var i = 0; i < ci.length; i++) {
      this.additem(type1Val(ci[i], 'Quantity'), type1Val(ci[i], 'Title'), type2Val(ci[i], 'Price'), type2Val(ci[i], 'ItemTotal'), ci[i].getElementsByTagName('CartItemId')[0].childNodes[0].nodeValue, ci[i].getElementsByTagName('ASIN')[0].childNodes[0].nodeValue)
    }
    var st = document.getElementById('subtotal')
    var stot = xml.getElementsByTagName('SubTotal')[0]
    var chkout = document.getElementById('checkout')
    if (stot) {
      st.innerHTML = stot.lastChild.childNodes[0].nodeValue
      chkout.style.display = ''
    } else {
      st.innerHTML = '0'
      chkout.style.display = 'none'
    }
    if (pu = xml.getElementsByTagName('PurchaseURL')[0]) this.purchaseUrl = pu.childNodes[0].nodeValue
    return items
  }
  this.getCart = function(cb) {
    function gotCart(resp) {
      xmlDoc = BC.parseXML(resp)
      return iserror(xmlDoc) ? cb(null) : cb(xmlDoc)
    }
    var request = "&Operation=CartGet"
            + "&ResponseGroup=Cart"
            + "&CartId=" + this.cartid
            + "&HMAC=" + this.hmac

    var ws = app.webService.AWS
    ws(request, gotCart, function(err) { return cb(null) })
  }
  this.createCart = function(cb, asin, qty) {
    function gotCart(resp) {
      xmlDoc = BC.parseXML(resp)
      if (iserror(xmlDoc)) return cb(null)
      _this.cartid = xmlDoc.getElementsByTagName('CartId')[0].childNodes[0].nodeValue
      _this.hmac = xmlDoc.getElementsByTagName('URLEncodedHMAC')[0].childNodes[0].nodeValue
      return cb(xmlDoc)
    }
    var request = "&Operation=CartCreate"
            + "&MergeCart=True"
            + "&AssociateTag=" + this.assoicateTag
            + "&Item.1.ASIN=" + asin
            + "&Item.1.Quantity=" + qty
    var ws = app.webService.AWS
    ws(request, gotCart, function(err) { return cb(null) })
  }
  this.addCartItem = function(cb, asin, qty) {
    function gotCart(resp) {
      function gotItems(xml) {
        return iserror(xmlDoc) ? cb(null) : cb(xmlDoc)
      }
      xmlDoc = BC.parseXML(resp)
      if (iserror(xmlDoc)) return cb(null)
      return cb(xmlDoc)
    }
    if (qty && this.cart_asin.indexOf(asin) !== -1) { // item already in cart
      return cb(null)
    }
    var request = "&Operation=CartAdd"
            + "&CartId=" + this.cartid
            + "&HMAC=" + this.hmac
            + "&MergeCart=True"
            + "&AssociateTag=" + this.assoicateTag
            + "&Item.1.ASIN=" + asin
            + "&Item.1.Quantity=" + qty
    var ws = app.webService.AWS
    ws(request, gotCart, function(err) { return cb(null) })
  }
  this.clearCart = function(cb) {
    function gotCart(resp) {
      xmlDoc = BC.parseXML(resp)
      if (iserror(xmlDoc)) return cb(null)
      return cb(xmlDoc)
    }
    var request = "&Operation=CartClear"
            + "&CartId=" + this.cartid
            + "&HMAC=" + this.hmac

    var ws = app.webService.AWS
    ws(request, gotCart, function(err) { return cb(null) })
  }
  this.modifyCart = function(cb, cid, qty) {
    function gotCart(resp) {
      xmlDoc = BC.parseXML(resp)
      if (iserror(xmlDoc)) return cb(null)
      return cb(xmlDoc)
    }
    var request = "&Operation=CartModify"
            + "&CartId=" + this.cartid
            + "&MergeCart=True"
            + "&HMAC=" + this.hmac
            + "&AssociateTag=" + this.assoicateTag
            + "&Item.1.CartItemId=" + cid
            + "&Item.1.Quantity=" + qty

    var ws = app.webService.AWS
    ws(request, gotCart, function(err) { return cb(null) })
  }
  this.enableApparelElements = function(item, setting) {
    function setDisabled(elem) {
      if (setting) elem.removeAttribute('disabled')
      else elem.disabled = 'disabled'
    }
    for (var i in item.apparel.dimList) {
      setDisabled(item.apparel.dimList[i], !setting)
    }
    setDisabled(item.apparel.qtyElem)
  }
  this.setAdd2CartImage = function(item, setting) {
    item.addButElem.src = setting ? "images/amazon-add.gif" : "images/shopcart_view1.gif"
  }
  this.add2cart = function(e) {
    var evt = BC.getEventObject(e)
    var id = evt.srcElement.getAttribute('asin')
    this.cartParent = document.getElementById(id).lastChild
    this.setAdd2CartImage(this.items[id], false)
    var asin = this.items[id].ASIN
    var qty = 1
    if (this.items[id].apparel) {
      qty = this.items[id].apparel.qtyElem.value
      this.enableApparelElements(this.items[id],false)
    }
    return this.cartid ? this.addCartItem(buildCart, asin, qty) : this.createCart(buildCart, asin, qty)
  }
  this.delitem = function(e) {
    var evt = BC.getEventObject(e)
    var cid = evt.srcElement.parentNode.getAttribute('itemid')
    var asin = evt.srcElement.getAttribute('asin')
    id = _this.getItemID(asin)
    _this.items[id].addButElem.src = "images/amazon-add.gif"
    if (_this.items.apparel) _this.enableApparelElements(_this.items[id], true)
    _this.setAdd2CartImage(_this.items[id], true)
    return _this.modifyCart(buildCart, cid, 0)
  }
  function buildCart(xml) {
    if (xml) { // null when trying to add dup. item
      var items = _this.cart2HTML(xml)
      _this.cartElem.replaceChild(items, _this.cartElem.firstChild)
    } else return
    _this.cartElem.style.display = 'block'
    if (_this.cartParent) _this.cartParent.appendChild(_this.cartElem)
    var st = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop
    var os = BC.getOffsets(_this.cartElem)
    var delta = BQ.getY(_this.cartElem) - st + _this.cartElem.offsetHeight - BC.getAvailScreenHW().h
    if (delta > 0) setTimeout(function() { window.scrollBy(0, delta) }, 10)
  }
  this.checkout = function(e) {
    BC.getEventObject(e).endEvent()
    window.location.href = _this.purchaseUrl
  }
  function iteminfo(id) {
    this.ID = id
    this.ASIN = id
    this.items = null
    this.addButElem = null
    this.totalNew = null
    this.apparel = null
  }
  iteminfo.prototype.apparelSetup = function() {
    this.apparel = {
      dims: null,
      qtyElem: null,
      priceElem: null,
      priceRange: null,
      merchantId: null,
      dimList: []
    }
  }
  this.initialize = function() {
    this.cartElem = document.getElementById('shopcart')
    this.itemsNode = document.getElementById('catalog')
    var inode = this.itemsNode.firstChild
    var item = null
    if (!this.itemsNode) return
    function addDimElems(lstElem, optval) {
      function addDimOption(lstelem, optval) {
        var opt = document.createElement('option')
        opt.value = optval
        opt.innerHTML = optval
        lstelem.appendChild(opt)
      }
      function getDimListAll(selectElem, dimid) {
        var item = selectElem.iteminfo
        var slst = []
        for (var i = 0; i < item.items.length; i++) {
          if (slst.indexOf(item.items[i][dimid]) === -1) {
            slst.push(item.items[i][dimid])
          }
        }
        slst = slst.sort()
        for (i = 0; i < slst.length; i++) addDimOption(selectElem, slst[i])
      }
      function getDimList4Value(selectElem, dimid, curdim) {
        var item = selectElem.iteminfo
        var slst = []
        for (var i = 0; i < item.items.length; i++) {
          if (item.apparel.dims[curdim].value == item.items[i][curdim]) {
            slst.push(item.items[i][dimid])
          }
        }
        slst = slst.sort()
        for (i = 0; i < slst.length; i++) addDimOption(selectElem, slst[i])
      }
      function gotfocus(e) {
        var evt = BC.getEventObject(e)
        evt.endEvent()
        var dimid = evt.srcElement.getAttribute('dimid')
        var item = evt.srcElement.iteminfo
        var dimval = function(dimid) {
          for (var id in item.apparel.dims) {
            if (evt.srcElement != item.apparel.dimList[id] && item.apparel.dimList[id].value.length) return id
          }
          return ''
        }
        var curdim = dimval(dimid)
        evt.srcElement.innerHTML = ''
        if (curdim === '') getDimListAll(evt.srcElement, dimid)
        else getDimList4Value(evt.srcElement, dimid, curdim)
        item.apparel.dims[dimid].value = evt.srcElement.value
      }
      function enable(item, setting) {
        if (setting) {
          item.apparel.qtyElem.removeAttribute('disabled')
          item.addButElem.removeAttribute('disabled')
        } else {
          item.apparel.qtyElem.disabled = 'disabled'
          item.addButElem.disabled = 'disabled'
        }
        item.addButElem.style.cssText = setting ? '' : 'opacity:.2;filter:alpha( opacity=25 )'
      }
      function gotpicked(e) {
        var evt = BC.getEventObject(e)
        evt.endEvent()
        var dimid = evt.srcElement.getAttribute('dimid')
        var item = evt.srcElement.iteminfo
        if (evt.srcElement === ' ') debugger

        function getTotalNew() {
          function gotQuantity(resp) {
            xmlDoc = BC.parseXML(resp)
            if (iserror(xmlDoc)) return
            var totnew = (tnn = xmlDoc.getElementsByTagName('TotalNew')) ? tnn[0].childNodes[0].nodeValue : 0
            item.totalNew = totnew
            if (totnew > 0) {
              item.apparel.qtyElem.innerHTML = ''
              for (var i = 0; i < totnew; i++) addDimOption(item.apparel.qtyElem, i + 1)
              enable(item, true)
              item.apparel.qtyElem.removeAttribute('disabled')
              var lp = xmlDoc.getElementsByTagName('LowestNewPrice')[0].lastChild.childNodes[0].nodeValue
              item.apparel.priceElem.innerHTML = lp
              item.addButElem.removeAttribute('disabled')
              item.apparel.dsplDims.innerHTML = 'Size: ' + item.apparel.dimList['Size'].value + ', Color: ' + item.apparel.dimList['Color'].value
            } else {
              enable(item, false)
              item.apparel.dsplDims.innerHTML = 'Size: None, Color: None'
              item.apparel.priceElem.innerHTML = item.apparel.priceRange
            }
          }
          var request = "&Operation=ItemLookup"
            + "&ItemId=" + item.ASIN
            + "&ItemType=ASIN"
            + "&MerchantId=" + item.apparel.merchantId
            + "&ResponseGroup=OfferSummary"

          var ws = app.webService.AWS
          ws(request, gotQuantity, function(err) { return })
        }
        var allDimsSelected = function() {
          for (var i in item.apparel.dims)
            if (item.apparel.dimList[i].value.length === 0) return false
          return true
        }
        item.apparel.dims[dimid].value = evt.srcElement.value
        if (allDimsSelected()) {
          var getASIN = function() {
            var dimsMatch = function() {
              for (var d in item.apparel.dims) {
                if (item.apparel.dims[d].value != item.items[i][d]) return false
              }
              return true
            }
            for (var i = 0; i < item.items.length; i++) {
              if (dimsMatch()) return item.items[i].asin
            }
          }
          item.ASIN = getASIN()
          setTimeout(getTotalNew, 100)
        } else {
          item.apparel.qtyElem.disabled = 'disabled'
          item.apparel.priceElem.innerHTML = item.apparel.priceRange
        }
      }
      var de = document.createElement('div')
      de.className = 'dims'
      de.innerHTML = 'Please select the following:'
      de.style.cssText = 'font-weight:bold; margin-left:48px;color:maroon;'
      for (var d in item.apparel.dims) {
        var dl = document.createElement('div')
        dl.style.cssText = 'clear:left;;margin:3px 0;'
        var lbl = document.createElement('span')
        lbl.className = 'dims'
        lbl.innerHTML = d + ':'
        dl.appendChild(lbl)
        var sel = document.createElement('select')
        sel.className = 'dims'
        sel.onfocus = gotfocus
        sel.onchange = gotpicked
        sel.setAttribute('dimid', d)
        sel.iteminfo = item
        sel = dl.appendChild(sel)
        item.apparel.dimList[d] = sel
        de.appendChild(dl)
      }
      var clearSelection = function(e) {
        var evt = BC.getEventObject(e)
        var se = evt.srcElement.parentNode.getElementsByTagName('select')
        for (var i = 0; i < se.length; i++) {
          se[i].value = ''
        }
        enable(evt.srcElement.iteminfo, false)
        evt.srcElement.iteminfo.apparel.priceElem.innerHTML = evt.srcElement.iteminfo.apparel.priceRange
      }
      var clrdims = document.createElement('input')
      clrdims.type = 'button'
      clrdims.style.cssText = 'clear:both;color:maroon; margin-top:4px; display: block;font-size:smaller;font-family:arial;'
      clrdims.value = 'clear selection'
      clrdims.onclick = clearSelection
      clrdims.iteminfo = item
      de.appendChild(clrdims)
      inode.firstChild.nextSibling.appendChild(de)
      var p3 = inode.firstChild.nextSibling.nextSibling
      var p3qty = document.createElement('div')
      p3qty.style.cssText = 'margin:3px 0;'
      p3qty.innerHTML = "<span style='font-size:small'>Quantity: </span><select disabled='disabled'><option value='1'>1</option></select>"
      item.apparel.qtyElem = p3qty.firstChild.nextSibling
      p3qty = p3.insertBefore(p3qty, p3.firstChild)
      p3dims = document.createElement('span')
      p3dims.innerHTML = 'Size: None, Color: None'
      p3dims.style.cssText = 'font-size:x-small;display:block;text-align:center;'
      item.apparel.dsplDims = p3.insertBefore(p3dims, p3qty)
      item.apparel.priceElem = p3.lastChild.previousSibling
      item.apparel.priceRange = item.apparel.priceElem.innerHTML
      item.addButElem = p3.lastChild.previousSibling;
    }
    var bqfid = '1401924514'
    while (inode) {
      var id = inode.getAttribute('id')
      while (!id) {
        inode = inode.nextSibling
        if (inode === null) return
        id = inode.getAttribute('id')
      }
      this.items[id] = new iteminfo(id)
      item = this.items[id]
      item.totalNew = inode.getAttribute('avail_new')
      item.addButElem = inode.firstChild.nextSibling.nextSibling.lastChild.previousSibling;
      if (id === bqfid) {
        //debugger
        var p3x = document.createElement('div')
        p3x.className = 'prdpnl3xp'
        var p3 = inode.firstChild.nextSibling.nextSibling
        //          var insAt = p3.parentNode.lastChild.previousSibling
        p3.className = 'prdpnl3xc'
        var amzlogo = document.createElement('img')
        amzlogo.src = "images/amzcom_logo1.png"
        p3.appendChild(amzlogo)
        var p3cl = p3.cloneNode(true)
        p3.parentNode.replaceChild(p3x, p3)
        p3x.appendChild(p3cl)
        var links = BQ.getOtherBookSellerLinks()
        links.style.cssText = 'position:relative;text-align:center;font-size:smaller;'
        //          inode.style.height = (inode.offsetHeight + 10) + 'px';
        p3x.appendChild(links)
        var ul = inode.getElementsByTagName('ul')[0]
        var li = document.createElement('li')
        li.className = 'prdfeature'
        li.innerHTML = 'Kindle Edition Available'
        ul.appendChild(li)
        if (app.isIE) p3x.style.marginRight = '8px'
      }
      inode = inode.nextSibling
    }
  }
}
