$.newsroom.ui = {};

$.newsroom.ui.config = {
  before_clear_warning: "Are you sure you want to remove all items from your basket?",
  email_basket_modal_width: 400,
  email_basket_modal_height: 400,
  basket_action_id_modifiers: []
};

$.newsroom.ui.flash = function(type, message) {
  alert(message);
};

$.newsroom.ui.modal = {};

$.newsroom.ui.modal.close = function() {
  $(window).unbind('keyup');
  $('.modalClose').click();
};

$.newsroom.ui.modal.open = function(content) {
  $(content).modal();

  var $window = $(window);

  var height = $window.height();
  var width = $(document).width();

  var containerHeight = height * 0.7;
  if (arguments.length >= 2) {
    if (arguments[1] >= 1) {
      containerHeight = arguments[1];
    } else {
      containerHeight = height * arguments[1];
    }
  }

  var containerTop = ($.browser.msie && $.browser.version < 7 ? $window.scrollTop() : 0) + (height / 2) - (containerHeight / 2);
  if (containerTop < 1) {
    containerTop = 1;
  }

  var $modalContainer = $('#modalContainer');
  $modalContainer.css('height', containerHeight + 'px');
  $modalContainer.css('top', containerTop + 'px');

  var containerWidth = 770;
  if (arguments.length >=3 ) {
    if (arguments[2] >= 1) {
      containerWidth = arguments[2];
    } else {
      containerWidth = width * arguments[2];
    }
  }

  var containerLeft = (width / 2) - (containerWidth / 2);
  $modalContainer.css('width', containerWidth + 'px');
  $modalContainer.css('left', containerLeft + 'px');

  $(document).keyup(function(e) {
    if (e.keyCode == 27) {
      $.newsroom.ui.modal.close();
    }
  });
};

$.newsroom.ui.decrementBasketCount = function() {
  var $basketNumber = $('#basket_number');
  $basketNumber.text(Math.max(parseInt($basketNumber.text()) - 1, 0));
};

$.newsroom.ui.incrementBasketCount = function() {
  var $basketNumber = $('#basket_number');
  $basketNumber.text(parseInt($basketNumber.text()) + 1);
};

$.newsroom.ui.basket = {};

$.newsroom.ui.basket.itemsOnPage = [];

$.newsroom.ui.basket.cachedElements = {};

$.newsroom.ui.basket.lookupElements = function(el) {
  var match = $.newsroom.ui.basket.cachedElements[el];
  if (!match) {
	var $el = $(el);
	$.newsroom.ui.basket.cachedElements[el] = [$el];
	if ($el.siblings().length == 1) {
	  $.newsroom.ui.basket.cachedElements[el].push($el.parent());
	}
	match = $.newsroom.ui.basket.cachedElements[el];
  }
  return match;
};

$.newsroom.ui.basket.hide = function(el) {
  var els = $.newsroom.ui.basket.lookupElements(el);
  for (var i = 0; i < els.length; i++) {
	els[i].hide();
  }
};

$.newsroom.ui.basket.show = function(el) {
  var els = $.newsroom.ui.basket.lookupElements(el);
  for (var i = 0; i < els.length; i++) {
	els[i].show();
  }
};

$.newsroom.ui.basket.showAddForItem = function(itemId) {
  var adderId = '#basket-add-' + itemId;
  var removerId = '#basket-remove-' + itemId;

  $.newsroom.ui.basket.show(adderId);
  $.newsroom.ui.basket.hide(removerId);

  for (var i = 0; i < $.newsroom.ui.config.basket_action_id_modifiers.length; i++) {
    var modifier = $.newsroom.ui.config.basket_action_id_modifiers[i];
    $.newsroom.ui.basket.show(adderId + modifier);
    $.newsroom.ui.basket.hide(removerId + modifier);
  }
};

$.newsroom.ui.basket.showRemoveForItem = function(itemId) {
  var removerId = '#basket-remove-' + itemId;
  var adderId = '#basket-add-' + itemId;

  $.newsroom.ui.basket.show(removerId);
  $.newsroom.ui.basket.hide(adderId);

  for (var i = 0; i < $.newsroom.ui.config.basket_action_id_modifiers.length; i++) {
    var modifier = $.newsroom.ui.config.basket_action_id_modifiers[i];
    $.newsroom.ui.basket.show(removerId + modifier);
    $.newsroom.ui.basket.hide(adderId + modifier);
  }
};

if (!Array.indexOf) {
  Array.prototype.indexOf = function(obj) {
    for (var i = 0; i < this.length; i++) {
      if (this[i] == obj) {
        return i;
      }
    }
    return -1;
  }
}

if (!Array.unique) {
  Array.prototype.unique = function() {
    var newArr = [], origLen = this.length, found, x, y;
    for (x = 0; x < origLen; x++) {
      found = undefined;
      for (y = 0; y < newArr.length; y++) {
        if (this[x] === newArr[y]) {
          found = true;
          break;
        }
      }
      if (!found) newArr.push(this[x]);
    }
    return newArr;
  }
}

$.newsroom.ui.refreshBasketState = function() {
  if (!$.newsroom.basket) {
    $.newsroom.basket = new $.newsroom.Basket
  }
  var basket = $.newsroom.basket;
  $('#basket_number').text(basket.count());
  $('#basket_number_descriptor').text(basket.count() == 1 ? 'Item' : 'Items');
  if (basket.items) {
    for (i = 0; i < $.newsroom.ui.basket.itemsOnPage.length; i++) {
      var basketItemId = $.newsroom.ui.basket.itemsOnPage[i];
      var inBasket = (basket.items.indexOf(basketItemId) < 0);
      inBasket ? $.newsroom.ui.basket.showAddForItem(basketItemId) : $.newsroom.ui.basket.showRemoveForItem(basketItemId);
    }
  }
};

$.newsroom.ui.setupBasketHandlers = function() {
  var $basket = $($.newsroom.basket);

  $basket.bind('changed', function(e, basket) {
    $.newsroom.ui.refreshBasketState();
  });

  $basket.bind('itemAdded', function(e, itemId) {
    $.newsroom.ui.incrementBasketCount();
  });

  $basket.bind('itemRemoved', function(e, itemId) {
    $.newsroom.ui.decrementBasketCount();
  });

  $basket.bind('willClear', function(e) {
    if (!confirm($.newsroom.ui.config.before_clear_warning)) {
      e.preventDefault();
    }
  });

  for (var i = 0; i < $.newsroom.ui.basket.itemsOnPage.length; i++) {
    var itemId = $.newsroom.ui.basket.itemsOnPage[i];
    $('#basket-add-' + itemId).click(function(e) {
      var basketItemId = $(this).attr('id').replace('basket-add-', '');
      $.newsroom.ui.basket.showRemoveForItem(basketItemId);
      $.newsroom.basket.add(basketItemId);
      e.preventDefault();
    });
    $('#basket-remove-' + itemId).click(function(e) {
      var basketItemId = $(this).attr('id').replace('basket-remove-', '');
      $.newsroom.ui.basket.showAddForItem(basketItemId);
      $.newsroom.basket.remove(basketItemId);
      e.preventDefault();
    });
    for (var j = 0; j < $.newsroom.ui.config.basket_action_id_modifiers.length; j++) {
      var modifier = $.newsroom.ui.config.basket_action_id_modifiers[j];
      if (modifier.length > 0) {
        $('#basket-add-' + itemId + modifier).click(function(e) {
          var basketItemId = $(this).attr('id').replace('basket-add-', '').replace(modifier, '');
          $.newsroom.ui.basket.showRemoveForItem(basketItemId);
          $.newsroom.basket.add(basketItemId);
          e.preventDefault();
        });
        $('#basket-remove-' + itemId + modifier).click(function(e) {
          var basketItemId = $(this).attr('id').replace('basket-remove-', '').replace(modifier, '');
          $.newsroom.ui.basket.showAddForItem(basketItemId);
          $.newsroom.basket.remove(basketItemId);
          e.preventDefault();
        });
      }
    }
  }

};

$(document).ready(function() {
  $.newsroom.ui.basket.itemsOnPage = $.newsroom.ui.basket.itemsOnPage.unique();
  $.newsroom.ui.refreshBasketState();
  $.newsroom.ui.setupBasketHandlers();
});

