/*global Cookies, newAccountHandler, path, vufindString, Lightbox, updatePageForLogin */

var _CART_COOKIE = 'vufind_cart';
var _CART_COOKIE_SOURCES = 'vufind_cart_src';
var _CART_COOKIE_DELIM = "\t";

var currentId,currentSource;

function getCartItems() {
  var items = Cookies.getItem(_CART_COOKIE);
  if(items) {
    return items.split(_CART_COOKIE_DELIM);
  }
  return [];
}
function getCartSources() {
  var items = Cookies.getItem(_CART_COOKIE_SOURCES);
  if(items) {
    return items.split(_CART_COOKIE_DELIM);
  }
  return [];
}
function getFullCartItems() {
  var items = getCartItems();
  var sources = getCartSources();
  var full = [];
  if(items.length == 0) {
    return [];
  }
  for(var i=items.length;i--;) {
    full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1);
  }
  return full;
}

function addItemToCart(id,source) {
  if(!source) {
    source = 'VuFind';
  }
  var cartItems = getCartItems();
  var cartSources = getCartSources();
  var sIndex = cartSources.indexOf(source);
  if(sIndex < 0) {
    // Add source to source cookie
    cartItems[cartItems.length] = String.fromCharCode(65+cartSources.length) + id;
    cartSources[cartSources.length] = source;
    Cookies.setItem(_CART_COOKIE_SOURCES, cartSources.join(_CART_COOKIE_DELIM), false, '/');
  } else {
    cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id;
  }
  Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/');
  $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)+1);
  return true;
}
function uniqueArray(op) {
  var ret = [];
  for(var i=0;i<op.length;i++) {
    if(ret.indexOf(op[i]) < 0) {
      ret.push(op[i]);
    }
  }
  return ret;
}
function removeItemFromCart(id,source) {
  var cartItems = getCartItems();
  var cartSources = getCartSources();
  // Find
  var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id);
  if(cartIndex > -1) {
    var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65;
    var cartItem = cartItems[cartIndex];
    var saveSource = false;
    for(var i=cartItems.length;i--;) {
      if(i==cartIndex) {
        continue;
      }
      // If this source is shared by another, keep it
      if(cartItems[i].charCodeAt(0)-65 == sourceIndex) {
        saveSource = true;
        break;
      }
    }
    cartItems.splice(cartIndex,1);
    // Remove unused sources
    if(!saveSource) {
      var oldSources = cartSources.slice(0);
      cartSources.splice(sourceIndex,1);
      // Adjust source index characters
      for(var j=cartItems.length;j--;) {
        var si = cartItems[j].charCodeAt(0)-65;
        var ni = cartSources.indexOf(oldSources[si]);
        cartItems[j] = String.fromCharCode(65+ni)+cartItems[j].substring(1);
      }
    }
    if(cartItems.length > 0) {
      Cookies.setItem(_CART_COOKIE, uniqueArray(cartItems).join(_CART_COOKIE_DELIM), false, '/');
      Cookies.setItem(_CART_COOKIE_SOURCES, uniqueArray(cartSources).join(_CART_COOKIE_DELIM), false, '/');
    } else {
      Cookies.removeItem(_CART_COOKIE, '/');
      Cookies.removeItem(_CART_COOKIE_SOURCES, '/');
    }
    $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)-1);
    return true;
  }
  return false;
}
var cartNotificationTimeout = false;
function registerUpdateCart($form) {
  if($form) {
    $("#updateCart, #bottom_updateCart").unbind('click').click(function(){
      var elId = this.id;
      var selectedBoxes = $("input[name='ids[]']:checked", $form);
      var selected = [];
      $(selectedBoxes).each(function(i) {
        selected[i] = this.value;
      });
      if (selected.length > 0) {
        var inCart = 0;
        var msg = "";
        var orig = getFullCartItems();
        $(selected).each(function(i) {
          for (var x in orig) {
            if (this == orig[x]) {
              inCart++;
              return;
            }
          }
          var data = this.split('|');
          addItemToCart(data[1], data[0]);
        });
        var updated = getFullCartItems();
        var added = updated.length - orig.length;
        msg += added + " " + vufindString.itemsAddBag;
        if (inCart > 0 && orig.length > 0) {
          msg += "<br/>" + inCart + " " + vufindString.itemsInBag;
        }
        if (updated.length >= vufindString.bookbagMax) {
          msg += "<br/>" + vufindString.bookbagFull;
        }
        $('#'+elId).data('bs.popover').options.content = msg;
        $('#cartItems strong').html(updated.length);
      } else {
        $('#'+elId).data('bs.popover').options.content = vufindString.bulk_noitems_advice;
      }
      $('#'+elId).popover('show');
      if (cartNotificationTimeout !== false) {
        clearTimeout(cartNotificationTimeout);
      }
      cartNotificationTimeout = setTimeout(function() {
        $('#'+elId).popover('hide');
      }, 5000);
      return false;
    });
  }
}

// Ajax cart submission for the lightbox
var lastCartSubmit = false;
function cartSubmit($form) {
  lastCartSubmit = $form;
  var submit = $form.find('input[type="submit"][clicked=true]').attr('name');
  if (submit == 'print') {
    //redirect page
    var checks = $form.find('input.checkbox-select-item:checked');
    if(checks.length > 0) {
      var url = path+'/Records/Home?print=true';
      for(var i=0;i<checks.length;i++) {
        url += '&id[]='+checks[i].value;
      }
      document.location.href = url;
    } else {
      Lightbox.displayError(vufindString['bulk_noitems_advice']);
    }
  } else if ((submit != 'empty' || confirm(vufindString['confirmEmpty']))
  && (submit != 'delete' || confirm(vufindString['confirmDelete']))) {
    Lightbox.submit($form, Lightbox.changeContent);
  } else {
    $('#modal').find('.fa.fa-spinner').remove();
  }
}

$(document).ready(function() {
  // Record buttons
  var cartId = $('#cartId');
  if(cartId.length > 0) {
    cartId = cartId.val().split('|');
    currentId = cartId[1];
    currentSource = cartId[0];
    $('#cart-add.correct,#cart-remove.correct').removeClass('correct hidden');
    $('#cart-add').click(function() {
      addItemToCart(currentId,currentSource);
      $('#cart-add,#cart-remove').toggleClass('hidden');
    });
    $('#cart-remove').click(function() {
      removeItemFromCart(currentId,currentSource);
      $('#cart-add,#cart-remove').toggleClass('hidden');
    });
  } else {
    // Search results
    var $form = $('form[name="bulkActionForm"]');
    registerUpdateCart($form);
  }
  $("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'});

  // Setup lightbox behavior
  // Cart lightbox
  $('#cartItems').click(function() {
    return Lightbox.get('Cart','Cart');
  });
  // Overwrite
  Lightbox.addFormCallback('accountForm', function(html) {
    updatePageForLogin();
    if (lastCartSubmit !== false) {
      cartSubmit(lastCartSubmit);
      lastCartSubmit = false;
    } else {
      newAccountHandler(html);
    }
  });
  Lightbox.addFormHandler('cartForm', function(evt) {
    cartSubmit($(evt.target));
    return false;
  });
  Lightbox.addFormCallback('bulkEmail', function(html) {
    Lightbox.confirm(vufindString['bulk_email_success']);
  });
  Lightbox.addFormCallback('bulkSave', function(html) {
    // After we close the lightbox, redirect to list view
    Lightbox.addCloseAction(function() {
      document.location.href = path+'/MyResearch/MyList/'+Lightbox.lastPOST['list'];
    });
    Lightbox.confirm(vufindString['bulk_save_success']);
  });
  Lightbox.addFormHandler('exportForm', function(evt) {
    $.ajax({
      url: path + '/AJAX/JSON?' + $.param({method:'exportFavorites'}),
      type:'POST',
      dataType:'json',
      data:Lightbox.getFormData($(evt.target)),
      success:function(data) {
        if(data.data.needs_redirect) {
          document.location.href = data.data.result_url;
        } else {
          Lightbox.changeContent(data.data.result_additional);
        }
      },
      error:function(d,e) {
        //console.log(d,e); // Error reporting
      }
    });
    return false;
  });
  Lightbox.addPermenantCloseAction(function() {
    // Update cart items (add to cart, remove from cart, cart lightbox interface)
    var cartCount = $('#cartItems strong');
    if(cartCount.length > 0) {
      var cart = getFullCartItems();
      var id = $('#cartId');
      if(id.length > 0) {
        id = id.val();
        $('#cart-add,#cart-remove').addClass('hidden');
        if(cart.indexOf(id) > -1) {
          $('#cart-remove').removeClass('hidden');
        } else {
          $('#cart-add').removeClass('hidden');
        }
      }
      cartCount.html(cart.length);
    }
  });
});