(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var productApi = require("./product");
var angularUtils = require("../utilities/angular");

module.exports = (function () {
  var Cart;
  var hasSubmitOrderOverride = false;
  var onCheckout = [];

  function returnCart() {
    return Cart || window.angular.element(document.body).injector().get('Cart');
  }

  function updateCart() {
    Cart = returnCart();
    Cart.get({}, Cart.updateCart);
  } 

  function applyCoupon(coupon, callback) {
    Cart = returnCart();
    Cart.coupon({
      couponCode:coupon, 
      email:currentUser.email
    });
    updateCart();
  }

  function getCart(callback) {
    Cart = returnCart();
    updateCart();
    callback(Cart.getCart());
  }

  function addProductToCart(product, callback) {
    Cart = returnCart();

    if(product.numberOfPrepaid) {
      productApi.getProduct(product.pcId, function(pcInfo) {
        var subscriptionSetting = _.find(pcInfo.subscriptionSettings, {
          frequency: product.frequency, 
          numberOfPrepaid: product.numberOfPrepaid
        });

        if(subscriptionSetting) {
          product.subscriptionSettingId = subscriptionSetting.id;   
          Cart.addProductToCart(product, callback);
          updateCart();
        } else {
          callback({err: 'no such subscription setting available'});
        }
      });
    } else {
      Cart.addProductToCart(product, callback);
      updateCart();
    }
  }

  return {
    update: updateCart,
    get: getCart,
    addProduct: addProductToCart,
    applyCoupon: applyCoupon
  }
})();
},{"../utilities/angular":8,"./product":4}],2:[function(require,module,exports){
module.exports = (function () {
  function init(config, callback) {
    var widget = config.widgetId;
    window.friendbuy = window.friendbuy || [];
    window.friendbuy.push(['widget', widget]);

    SymphonyAPI(['user', 'order', function(user, order) {
      window.friendbuy = window.friendbuy || [];
      var siteUrl = config.siteId;

      //Initialize user info with defaults
      var userInfo = {
          id: user ? user.id : null,
          email: user ? user.email : null
      };

      if(order) {
          //override customer info if we have order.customer
          if(order.customer) {
              userInfo.id = order.customer.id;
              userInfo.email = order.customer.email;
          }

          var orderInfo = { 
              id: order.id,
              amount: order.total/100
          }

          var productsInfo = _.map(order.lineItems, function(lineItem) {
              return {
                  sku: lineItem.productSku, 
                  price: lineItem.memberPrice/100,
                  quantity: lineItem.quantity
              }
          });

          window.friendbuy.push(['track', 'order', orderInfo]);
          window.friendbuy.push(['track', 'products', productsInfo]);
      }

      window.friendbuy.push(['site', siteUrl]);
      window.friendbuy.push(['track', 'customer', userInfo]);

      (function (f, r, n, d, b, y) {
           b = f.createElement(r), 
           y = f.getElementsByTagName(r)[0];
           b.async = 1;
           b.src = n;
           y.parentNode.insertBefore(b, y);
       })(document, 'script', '//djnf6e5yyirys.cloudfront.net/js/friendbuy.min.js');
    }])
  }

  return {
    init: init
  }
})();
},{}],3:[function(require,module,exports){
module.exports = (function () {
  var trackingAnalytics = require("./trackingAnalytics");
  var cartApi = require("./cart");
  var productApi = require("./product");
  var friendbuy = require("./friendbuy");

  trackingAnalytics.anonSubscribe();
  SymphonyAPI(["page", function(p) {
    window.dataLayer = window.dataLayer || [];
    p && window.dataLayer.push({ "event": p.type });
  }]);

  var API = {};

  API.cart = {};
  API.products = {};
  API.track = {};

  API.track.purchasingChannel = trackingAnalytics.purchasingChannel;
  API.track.userHasSubscriptions = trackingAnalytics.userHasSubscriptions;

  API.friendbuy= friendbuy.init;

  API.cart.update = cartApi.update;
  API.cart.applyCoupon = cartApi.applyCoupon;
  API.cart.addProduct = cartApi.addProduct;
  API.cart.get = function(callback) {
    typeof SymphonyAPI === 'function' 
      ? SymphonyAPI(["cart",  callback])
      : cartApi.getCart(callback);
  }

  API.products.getById = productApi.getById;
  API.products.getCurrent = function(callback) {
    typeof SymphonyAPI === 'function' 
      ? SymphonyAPI(["product",  callback])
      : console.error("SymphonyAPI does not exist");
  }

  return API;
})();
},{"./cart":1,"./friendbuy":2,"./product":4,"./trackingAnalytics":5}],4:[function(require,module,exports){
module.exports = (function () {
  function getById(id, callback) {
    $.getJSON('/productcluster/' + id, callback);
  }

  return {
    getById: getById
  }
})();
},{}],5:[function(require,module,exports){
var watchObjects = require("../utilities/watchObjects");

module.exports = (function () {
  function trackUserHasSubscriptions() {
    SymphonyAPI(["page", "order", function(page, o) {
      if (page.type === 'order') {
        var filter = _.filter(o.lineItems, function(item) {
          return item.type === "SUBSCRIPTION" && item.fulfillmentStatus !== 'CANCELLED';
        });

        if (filter.length > 0) {
          analytics && analytics.identify(o.customer.email, {
            "Has Subscriptions": true
          });
        }
      } else {
        currentUser && $.getJSON("/api/v1/subscriptions", function(subs) {
          var activeSub = 0;
          _.each(subs, function(val, index) {
            if (val.subscriptionState.status === 'ONGOING') {
              activeSub += 1;
            }
          });

          analytics && analytics.identify(currentUser.email, {
            "Has Subscriptions": activeSub > 0 ? true : false
          });
        });
      }
    }]);
  }

  function trackAnonSubscribe() {
    var $footerSubscribe = $(".footer-subscribe-container").add(".sp-subscribe");
    $footerSubscribe.find("button").on("click", function() { 
      var email = $footerSubscribe.find("input").val();  
      analytics && analytics.identify(email); 
    });
  }
  
  function trackPurchasingChannel() {
    watchObjects.watchCurrentUser(function(user) { 
      user && analytics && analytics.identify(user.email, {
          "Purchasing Channel": user.purchasingChannel.name
      });
    });
  }

  return {
    anonSubscribe: trackAnonSubscribe,
    purchasingChannel: trackPurchasingChannel,
    userHasSubscriptions: trackUserHasSubscriptions
  }
})();
},{"../utilities/watchObjects":15}],6:[function(require,module,exports){
Symphony.bundlesReady(function() {
	Symphony.API = require("./api");
	Symphony.Utils = require("./utilities");
	var waitUntilExists = require("./jqueryPlugins/waitUntilExists");
});
},{"./api":3,"./jqueryPlugins/waitUntilExists":7,"./utilities":11}],7:[function(require,module,exports){
module.exports = (function ($, window) {
  var intervals = {};
  var removeListener = function(selector) {
    if (intervals[selector]) {
      
      window.clearInterval(intervals[selector]);
      intervals[selector] = null;
    }
  };
  var found = 'waitUntilExists.found';
  $.fn.waitUntilExists = function(handler, shouldRunHandlerOnce, isChild) {
    var selector = this.selector;
    var $this = $(selector);
    var $elements = $this.not(function() { return $(this).data(found); });
    
    if (handler === 'remove') {
      removeListener(selector);
    }
    else {
      $elements.each(handler).data(found, true);
      
      if (shouldRunHandlerOnce && $this.length) {
        removeListener(selector);
      }
      else if (!isChild) {
        intervals[selector] = window.setInterval(function () {
          $this.waitUntilExists(handler, shouldRunHandlerOnce, true);
        }, 500);
      }
    }
  
    return $this;
  };
}(jQuery, window));
},{}],8:[function(require,module,exports){
module.exports = {
	safeApply: function($scope, applyFn) {
      !$scope.$$phase ? $scope.$apply(applyFn) : applyFn();
    }
}
},{}],9:[function(require,module,exports){
module.exports = function (callback, attempts, condition, timeout) {
  (function checkCondition() {
    if (condition()) {
      callback(null, true);
    } else if (attempts > 0) {
        --attempts;
      setTimeout(checkCondition, (timeout || 500));
    } else if (attempts <= 0 ) {
      callback(true, null);
    }
  })();
}
},{}],10:[function(require,module,exports){
module.exports = {
	get: function(name) {
      var nameEQ = name + "=";
      var ca = document.cookie.split(';');
      for(var i=0;i < ca.length;i++) {
          var c = ca[i];
          while (c.charAt(0)==' ') c = c.substring(1,c.length);
          if (c.indexOf(nameEQ) == 0) {
            return c.substring(nameEQ.length,c.length);
          } 
      }
    },

  drop: function(name, days, value) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
  }
}

},{}],11:[function(require,module,exports){
module.exports = (function () {
  /*UTILITIES*/
  var whenAvailable = require("./whenAvailable");
  var siteDetails = require("./siteDetails");
  var checkReadyState = require("./checkReadyState");
  var watchObjects = require("./watchObjects");
  var cookieUtils = require("./cookies");
  var stringUtils = require("./strings");
  var angularUtils = require("./angular");
  var urlUtils = require("./urls");

  function pushDataLayerEvent(name) {
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
      event: name+"Ready"
    });
  }

  /\/order\//.test(window.location.href) 
    && whenAvailable("order", pushDataLayerEvent);

  var Utils = {};
  
  Utils.watch = {};
  Utils.cookies = {};
  Utils.str = {};
  Utils.url = {};
  Utils.angular = {};

  Utils.siteDetails = siteDetails;
  Utils.whenAvailable = whenAvailable;
  Utils.checkReadyState = checkReadyState;

  Utils.watch.currentUser = watchObjects.currentUser;
  Utils.watch.productListSpinner = watchObjects.productListSpinner;
  Utils.watch.cart = watchObjects.cart;
  Utils.watch.scopeObject = watchObjects.scope;

  Utils.cookies.get = cookieUtils.get;
  Utils.cookies.drop = cookieUtils.drop;

  Utils.str.replaceAll = stringUtils.replaceAll;
  Utils.str.commaSeparateNumber = stringUtils.commaSeparateNumber;
  Utils.str.isJSON = stringUtils.isJSON;

  Utils.url.getParameters = urlUtils.getUrlParameters;
  Utils.url.openInNewTab = urlUtils.openInNewTab;

  Utils.angular.safeApply = angularUtils.safeApply;

  return Utils;
})();

},{"./angular":8,"./checkReadyState":9,"./cookies":10,"./siteDetails":12,"./strings":13,"./urls":14,"./watchObjects":15,"./whenAvailable":16}],12:[function(require,module,exports){
var ignoreVals = ["www", "com", "demo", "store"];

module.exports = function (callback) {
  var host = window.location.host.split('.');
  var env;
  var site = _.find(host, function(val) {
    return !_.contains(ignoreVals, val)
  })

  if (/sites/.test(site)) {
    //pod?
    env = site.replace("sites", "partner");
    site = 'kittydemo';
  } else if (/release/.test(site)) {
    var split = site.split('-');
    env = 'manage-release';
    site = split[0];
  } else {
    env = 'prod';
  }

  callback({
    site: site,
    env: env
  });
}
},{}],13:[function(require,module,exports){
module.exports = {
  	replaceAll:  function (find, replace, str) {
      return str.replace(new RegExp(find, 'g'), replace);
    },

    commaSeparateNumber: function (val){
      while (/(\d+)(\d{3})/.test(val.toString())){
        val = val.toString().replace(/(\d+)(\d{3})/, '$1'+','+'$2');
      }
      return val;
    },

    isJSON: function(str) {
	    try {
	        JSON.parse(str);
	    } catch (e) {
	        return false;
	    }
	    return true;
	}
}
},{}],14:[function(require,module,exports){
module.exports = {
	getUrlParameters: function (qs) {
	    qs = qs.split('+').join(' ');

	    var params = {},
	        tokens,
	        re = /[?&]?([^=]+)=([^&]*)/g;

	    while (tokens = re.exec(qs)) {
	        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
	    }

	    return params;
	},

    openInNewTab: function (url) {
      var win = window.open(url, '_blank');
      win.focus();
    }
}

},{}],15:[function(require,module,exports){
var checkReadyState = require("./checkReadyState");
module.exports = (function() {
  function watchScopeObject(ctrlSelector, object, callback) {
    function condition() { 
      return (window.angular 
        && window.angular.element(ctrlSelector) 
        && window.angular.element(ctrlSelector).scope()); 
    }

    checkReadyState(function(error, result) {
      if (result) {
        var scope = window.angular.element(ctrlSelector).scope();
          scope.$watch(object, function() {
            callback && callback(scope[object]);
          });
      }
    }, 50, condition, null);
  }

  return {
    scope: watchScopeObject,
    currentUser: function (callback) {
      watchScopeObject('[ng-controller="AppCtrl"]', "currentUser", callback);
    },

    productListSpinner: function (callback) {
      watchScopeObject('.product-list-spinner', "pageLoading", callback);
    },

    cart: function(callback) { //this function will only work on /cart
      watchScopeObject('[ng-controller="CheckoutCtrl"]', "cart", callback);
    }
  }
})();


},{"./checkReadyState":9}],16:[function(require,module,exports){
module.exports = function (name, callback) {
    var interval = 100; // ms
    var attempts = 0;
    var maxAttempts = 50;
    window.setTimeout(function() {
        if (window[name]) {
            callback(name);
        } else {
            attempts < maxAttempts && window.setTimeout(arguments.callee, interval);
            attempts++;
        }
    }, interval);
}
},{}]},{},[6]);