﻿/* Victor LaLoggia @ C2, June 12, 2009
*   Sitecore's page editor is implemented with Prototype.js.
*   It is well known that Prototype and jQuery do not play well together.
*   As per Sitecore (http://sitecoresupport.blogspot.com/2009/01/jquery-conflicts-with-pageeditor.html), 
*   vic added this modification (http://docs.jquery.com/Using_jQuery_with_Other_Libraries).
*
*   Every reference to the jQuery '$' nomenclature has been replaced with '$j'
*/
//!!
// Assure that /script/SelectorLibrary.js is loaded previous to this file
//!!
var $j = jQuery.noConflict();

if (typeof GMCR == 'undefined') var GMCR = {};

//***************************
//  Member functions
//***************************

//Get all of the products for the tab and brand and filter
GMCR.AddProduct = function(image, sellGroupID) {
    $j('td[hoverid]').closeCallout();

    var passedSellGroupID = sellGroupID;
    //GMCR.ProductCatalog is set in MainLayout.aspx
    var cat = sellGroupID.toString().substr(sellGroupID.toString().lastIndexOf('-') + 1, sellGroupID.toString().length - sellGroupID.toString().lastIndexOf('-') - 1);
    sellGroupID = sellGroupID.replace('-' + cat, '(' + cat + ')').replace('-' + GMCR.CurrentTabType, '');

    var quantitySelected = 1;
    var grindSelected = '';
    var grindNameSelected = '';
    var brandID = '';
    var productID = '';
    var renderURL = GMCR.BuildAddToCartURL('', quantitySelected, grindSelected, grindNameSelected, brandID) + "&sellGroupID=" + sellGroupID;

    $j('#justAddedMiniCart').html('<div id="tempLoader" class="justAddedPopupContainer"><h4 class="justAddedTitle">Adding to Cart...</h4><br/><img src="/Content/Images/global/product-selector/psProductLoader.gif" alt="loading..."/></div>');
    $j('#tempLoader').css('background-color', '#F7F4E4');
    GMCR.ShowJustAddedToCartPopup();
    //cutie poo per Ken...
    $j("td[id='" + passedSellGroupID + "']").effect("transfer", { to: '#justAddedMiniCart' }, 500);

    $j.ajax({ type: "POST", data: "{}", url: renderURL, dataType: 'json', contentType: 'application/x-www-form-urlencoded',
        success: function(data) {
            if (data.Result == 'OK') {
                $j('#miniCartResults').text(data.CartString);

                var cartPopupURL = GMCR.BuildAddToCartFetchURL(sellGroupID);
                $j.ajax({
                    url: cartPopupURL,
                    cache: false,
                    success: function(html) {
                        $j('#justAddedMiniCart').remove();
                        $j('#justAddedMiniCartContainer').html(html);
                        GMCR.ShowJustAddedToCartPopup();
                    }
                });
            } else {
                alert('Unable to add item to the cart, please try again later.');
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            //alert(XMLHttpRequest.status);
            //alert(XMLHttpRequest.statusText);
            //alert(XMLHttpRequest.responseText);
        }
    });
};

// This will add all the quick pick items
GMCR.AddQuickPickItems = function() {
  var quantitySelected = 1;
  var grindNameSelected = '';
  var brandID = '';
  var productID = '';

  $j('#justAddedMiniCart').html('<div id="tempLoader" class="justAddedPopupContainer"><h4 class="justAddedTitle">Adding to Cart...</h4><br/><img src="/Content/Images/global/product-selector/psProductLoader.gif" alt="loading..."/></div>');
  $j('#tempLoader').css('background-color', '#F7F4E4');
  // popup the adding to cart
  GMCR.ShowJustAddedToCartPopup();
  //cutie poo per Ken... This wil come from the button pressed
  //$j("td[id='" + passedSellGroupID + "']").effect("transfer", { to: '#justAddedMiniCart' }, 500);

  var renderURL = GMCR.BuildQuickPickAddToCartURL();

  $j.ajax({ type: "POST", data: "{}", url: renderURL, dataType: 'json', contentType: 'application/x-www-form-urlencoded',
    success: function(data) {
      if (data.Result == 'OK') {
        $j('#miniCartResults').text(data.CartString);
        $j('#justAddedMiniCart').html($j('#AddToCartSuccess').html());
        $j('#justAddedMiniCart').css('background-color', '#F7F4E4');

        // add click handler to close image
        $j('#imgCloseWindow').click(function() {
          $j('#justAddedMiniCart').hide();
        });

        // add click handler to close image
        $j('#textKeepShopping').click(function() {
          $j('#justAddedMiniCart').hide();
        });

        // add click handler to close text
        $j('#textCloseWindow').click(function() {
          $j('#justAddedMiniCart').hide();
        });

        $j('#ViewCartLinkInPopup').attr('href', $j('#phtop_0_NavigationTabs_MiniCart1_ShoppingCartLink').attr('href'));
        $j('#ViewCartLinkInPopup').attr('href', $j('#phtop_0_phloginandcart_0_ctl01_ShoppingCartLink').attr('href'));

        // fix external links in related products
        $j('.justAddedPopupContainer a').each(function() {
          GMCR.FixLinkForGA($j(this));
        });

        // Record event for GA
        pageTracker._trackEvent('Quick Pick', 'Add To Cart', 'TBD');
      } else {
        alert('Unable to add items to the cart, please try again later.');
      }

      // change popup to added to cart...
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
      //alert(XMLHttpRequest.status);
      //alert(XMLHttpRequest.statusText);
      //alert(XMLHttpRequest.responseText);
    }
  });

  $j("select[addid]").each(function() {
    $j(this).attr('selectedIndex', 0);
  });

  GMCR.ShowHideQuickPickSubmitButtons();
};

//Constructs the mini cart fetch URL
GMCR.BuildAddToCartFetchURL = function(sellGroupID) {
  var url = "/ajaxHandlers/Shop-All-KCups-Cart-PopupHandler.aspx?commandName=";
  url += "GetCartAddPopup";
  url += "&sellGroupID=" + sellGroupID;

  return url;
};

//Constructs the product fetch URL
GMCR.BuildProductFetchURL = function(tabType, brandName, filterName) {
  var url = "/ajaxHandlers/productselectorhandler.aspx?commandName=";
  url += "GetProducts";
  url += "&tabType=" + tabType;
  url += "&brandName=" + brandName;
  url += "&filterName=" + encodeURIComponent(filterName);
  url += "&clubMode=" + GMCR.ClubMode;
  url += "&maxItemsPerPage=" + GMCR.MaxItemsPerPage;
  url += "&shopAllKCups=1";

  return url;
};

GMCR.BuildQuickPickAddToCartURL = function() {
  var url = "/ajaxHandlers/shophandler.aspx?commandName=MultiAddToBasket&addData=";
  var addData = new Array();

  $j("select[addid]").each(function() {
    var qty = parseInt($j(this).val(), 10);
    if (!isNaN(qty) && qty > 0) {
      var cb = $j(this).closest('tr').find('input:checkbox');
      var weeks = 0;
      if (cb.attr('checked'))
        weeks = 4;
      addData.push($j(this).attr('addid') + ";" + qty + ";" + weeks);
    }
  });

  url += addData.join("|");

  return url;
};

//Get all of the products for the tab and brand and filter
GMCR.GetProducts = function(tabType, brandName, filterName) {
  $j('td[hoverid]').closeCallout();
  var renderURL = GMCR.BuildProductFetchURL(tabType, brandName, filterName);
  //reset the scroll counter and scroll back to first position
  GMCR.CurrentScrollSpot[GMCR.CurrentTabType] = 1;
  GMCRSelectorLibrary.ScrollProducts(0);
  $j('#resultsList-' + GMCR.CurrentTabType).html('<img src="/Content/Images/global/product-selector/psProductLoader.gif" alt="loading..."/>');
  $j.ajax({ type: "POST", data: "{}", url: renderURL, dataType: 'html', contentType: 'application/x-www-form-urlencoded',
    success: function(data) {
      $j('#resultsList-' + GMCR.CurrentTabType).html(data);

      if (GMCRSelectorLibrary.CurrentProductCount() === 0) {
        $j('#hdnProductCount-' + GMCR.CurrentTabType).after(GMCR.NoSeasonalItemsMessage);
      }

      //reset the paging counters and scroll enablers
      GMCR.CurrentStartNumber[GMCR.CurrentTabType] = GMCRSelectorLibrary.CurrentProductCount() === 0 ? 0 : 1;
      GMCR.CurrentEndNumber[GMCR.CurrentTabType] = GMCRSelectorLibrary.CurrentProductCount() > GMCR.MaxItemsPerPage ? GMCR.MaxItemsPerPage : GMCRSelectorLibrary.CurrentProductCount();
      try {
        GMCR.ScrollingEnabled[GMCR.CurrentTabType].left = false;
        GMCR.ScrollingEnabled[GMCR.CurrentTabType].right = GMCRSelectorLibrary.CurrentProductCount() > GMCR.MaxItemsPerPage ? true : false;
      } catch (Error) {
        GMCR.ScrollingEnabled = {
          kcup: { left: false, right: true }
        };
      }
      GMCRSelectorLibrary.ResetPagingView();
      $j('#filterName-' + GMCR.CurrentTabType).text(filterName);
      GMCRSelectorLibrary.ResetScrollArrows();
    }
  });
};

// There seem to be some issues with IE6 - we can assign this function directly
GMCR.SetTabStatus = function(image, imageId) {
  // Remove the mini cart
  $j('#justAddedMiniCart').hide();

  //hide them all
  $j("[id^='content']").hide();
  //show this one
  $j("[id^='content-" + imageId + "']").show();

  //reset all tabs as off
  $j('#topTabs img').each(function() {
    $j(this).changeSrc({ oldValue: '-active', newValue: '-inactive' });
  });

  //set this one tab to on
  image.changeSrc({ oldValue: '-inactive', newValue: '-active' });

  //save the current tab type
  GMCR.CurrentTabType = imageId;

  // Should we arrive from the QuickPick tab, load the product data
  if (imageId == "kcup") {
    GMCR.GetProducts(GMCR.CurrentTabType, GMCR.CurrentBrand[GMCR.CurrentTabType], "");
    GMCRSelectorLibrary.UnHighlightAllFilters();
  }
};

GMCR.ShowHideQuickPickSubmitButtons = function() {
  var totalQtySelected = 0;

  $j("select[addid]").each(function() {
    var qty = parseInt($j(this).val(), 10);
    var cb = $j(this).closest('tr').find('input:checkbox');
    if (!isNaN(qty) && qty > 0) {
      totalQtySelected += qty;
    } else {
      if (cb.attr('checked'))
        cb.attr('checked', false);
    }
  });

  if (totalQtySelected > 0) {
    // show and enable add to cart buttons
    $j('.qpAddToCartButton').each(function() {
      $j(this).fadeTo(500, 1);
      $j(this).unbind("click");
      $j(this).bind("click", function(e) {
        GMCR.AddQuickPickItems();
      });
    });
  } else {
    // hide and disable add to cart buttons
    $j('.qpAddToCartButton').each(function() {
      $j(this).fadeTo(500, 0.25);
      $j(this).unbind("click");
      $j(this).bind("click", function(e) {
        alert("Please select a quantity to add, then click add.");
      });
    });
  }
};

//***************************
//  On Document Ready
//***************************
$j(document).ready(function() {

  //
  //Config objects
  //
  var mQPKcup = 'qpkcup';
  var mKcup = 'kcup';
  
  GMCR.CurrentBrand = {
    kcup: 'all',
    qpkcup: 'all'
  };
  GMCR.CurrentStartNumber = {
    kcup: 1
  };
  GMCR.CurrentEndNumber = {
    kcup: 1
  };
  GMCR.CurrentScrollSpot = {
    kcup: 1
  };
  GMCR.ScrollingEnabled = {
    kcup: { left: false, right: true }
  };

  //Set up product popup defaults
  var tooltipDefaults = {
    className: "productPopUp", //class defining the popup
    cornerRadius: 5,
    orient: "above",
    width: 250,
    arrowHeight: 7,
    arrowInset: 50, //number of pixels from the left to put the arrow
    region: "#page",
    borderColor: "black",
    borderWidth: 5
  }

  //handle the top level tabs clicking
  // doesn't seem to work in IE6
  $j('#topTabs > img').live("click", function() {
    var tabId = $j(this).attr('id');
    GMCR.SetTabStatus($j(this), tabId);

    // Record event for GA
    if (tabId === mQPKcup)
      pageTracker._trackEvent('Shop All K-Cups', 'Top Tab Clicked', 'Quick Pick');
    else
      pageTracker._trackEvent('Shop All K-Cups', 'Top Tab Clicked', 'K-Cup Browser');
  });

  //handle the side slot brands and hiding and showing filters
  $j("[id^='brandSlots'] > div").click(function() {
    $j('#justAddedMiniCart').hide();
    //Save off the brand name for the tab type
    GMCR.CurrentBrand[GMCR.CurrentTabType] = $j(this).attr('id').split('-')[2];

    //set all of the slot types to off
    $j("div[id='brandSlots-" + GMCR.CurrentTabType + "'] div img").each(function() {
      $j(this).changeSrc({ oldValue: '_on', newValue: '_off' });
    });

    //set the current one to on
    $j(this).find('img').changeSrc({ oldValue: '_off', newValue: '_on' });

    //hide all of the other filter clouds of this type
    $j("div[brandName][tabType='" + GMCR.CurrentTabType + "']").each(function() {
      $j(this).hide();
    });

    //show this filter cloud
    $j("div[brandname='" + GMCR.CurrentBrand[GMCR.CurrentTabType] + "'][tabType='" + GMCR.CurrentTabType + "']").show();

    //Go get some for the default filter of this slot
    if (GMCR.DefaultFilterKCups === "") {
      GMCR.GetProducts(GMCR.CurrentTabType, GMCR.CurrentBrand[GMCR.CurrentTabType], "");
      GMCRSelectorLibrary.UnHighlightAllFilters();
    }
    else {
      var element = GMCRSelectorLibrary.GetFilterElementByName(GMCR.DefaultFilterKCups);
      GMCRSelectorLibrary.SelectFilter(element);
    }

    // Record event for GA
    pageTracker._trackEvent('K-Cup Browser', 'Brand Tab Clicked', GMCR.CurrentBrand[GMCR.CurrentTabType]);
  });

  //Make hoverIntent work as as JQuery 'live' event
  //handles the case of hovering over a product image
  $j('td[hoverid]').live('mouseover', function() {
    if (!$j(this).data('init')) {
      $j(this).data('init', true);
      $j(this).hoverIntent({
        sensitivity: 7,
        interval: 200,
        over: function() {
          // close all the other callouts
          $j('td[hoverid]').closeCallout();

          // Now show this one
          var popupId = $j(this).attr('id');
          var popupSelector = '#popup-' + popupId;
          $j(this).callout($j.extend({}, tooltipDefaults, {
            align: "left",
            content: popupSelector
          }));
          $j("#contentBox").click(function() {
            $j('td[hoverid="' + popupId + '"]').closeCallout();
          });
        },
        timeout: 0,
        out: function() {
          //$j(this).closeCallout();
        }
      });
      $j(this).trigger('mouseover');
    }
  });

  //Set the 'Filters' to highlighted by default
  //Either swap them back and forth and set both, or
  //if custom club, set the one we need
  if (GMCR.DefaultFilterKCups === "") {
    GMCRSelectorLibrary.UnHighlightAllFilters();
  }
  else {
    if (GMCR.ClubType === 'all') {
      GMCRSelectorLibrary.HighlightFilterByName(GMCR.DefaultFilterKCups);
      GMCR.CurrentTabType = mQPKcup;
      GMCRSelectorLibrary.HighlightFilterByName(GMCR.DefaultFilterQPKCup);
      GMCR.CurrentTabType = mKcup;
    }
    else {
      if (GMCR.ClubType === mKcup) {
        GMCRSelectorLibrary.HighlightFilterByName(GMCR.DefaultFilterKCups);
      }
      else {
        GMCRSelectorLibrary.HighlightFilterByName(GMCR.DefaultFilterQPKCup);
      }
    }
  }

  //Set the currently clicked filter as highlighted
  $j('.tagList li a').click(function() {
    GMCRSelectorLibrary.SelectFilter(this);

    // Record event for GA
    pageTracker._trackEvent('K-Cup Browser', 'Filter Clicked', GMCR.CurrentBrand[GMCR.CurrentTabType] + " - " + $j(this).text());

    return false;
  });

  //Compute this when the page loads for the client side objects
  var maxItemsPerPage = GMCRSelectorLibrary.CurrentProductCount() > GMCR.MaxItemsPerPage ? GMCR.MaxItemsPerPage : GMCRSelectorLibrary.CurrentProductCount();
  if (GMCR.ClubType === 'all') {
    //set both tabtypes
    GMCR.CurrentEndNumber[GMCR.CurrentTabType] = maxItemsPerPage;
    GMCR.CurrentTabType = mQPKcup;
    GMCR.CurrentEndNumber[GMCR.CurrentTabType] = maxItemsPerPage;
    GMCR.CurrentTabType = mKcup;
  } else {
    //just need this tab type
    GMCR.CurrentEndNumber[GMCR.CurrentTabType] = maxItemsPerPage;
  }


  //Scroll right if possible, reset future scrolling
  $j('#scrollRight-kcup').click(function() {
    $j('td[hoverid]').closeCallout();
    $j('#justAddedMiniCart').hide();
    if (GMCR.ScrollingEnabled[GMCR.CurrentTabType].right) {
      GMCR.ScrollingEnabled[GMCR.CurrentTabType].left = true; //reset the left scroll
      GMCR.CurrentScrollSpot[GMCR.CurrentTabType]++;
      GMCRSelectorLibrary.ScrollProducts(500);

      //set the start numbers forward maxitemsperpage amount, set the end forward as far as it can go
      GMCR.CurrentStartNumber[GMCR.CurrentTabType] = GMCR.CurrentStartNumber[GMCR.CurrentTabType] + GMCR.MaxItemsPerPage;

      // Calculate it like it's a full page, then trim it if it's bigger
      GMCR.CurrentEndNumber[GMCR.CurrentTabType] = GMCR.CurrentStartNumber[GMCR.CurrentTabType] + GMCR.MaxItemsPerPage - 1;
      if (GMCR.CurrentEndNumber[GMCR.CurrentTabType] >= GMCRSelectorLibrary.CurrentProductCount()) {
        GMCR.ScrollingEnabled[GMCR.CurrentTabType].right = false;
        GMCR.CurrentEndNumber[GMCR.CurrentTabType] = GMCRSelectorLibrary.CurrentProductCount();
      }

      //change arrows and paging view
      GMCRSelectorLibrary.ResetPagingView();
      GMCRSelectorLibrary.ResetScrollArrows();
    }

  });

  //Scroll left if possible, reset future scrolling
  $j('#scrollLeft-kcup').click(function() {
    $j('#justAddedMiniCart').hide();
    $j('td[hoverid]').closeCallout();
    if (GMCR.ScrollingEnabled[GMCR.CurrentTabType].left) {
      GMCR.ScrollingEnabled[GMCR.CurrentTabType].right = true; //reset the right scroll
      GMCR.CurrentScrollSpot[GMCR.CurrentTabType]--;
      GMCRSelectorLibrary.ScrollProducts(500);

      //set the start numbers back maxitemsperpage amount, set the end back as far as it went forward last time
      GMCR.CurrentStartNumber[GMCR.CurrentTabType] = GMCR.CurrentStartNumber[GMCR.CurrentTabType] - GMCR.MaxItemsPerPage;

      // since we're going left, it's always a full page....
      GMCR.CurrentEndNumber[GMCR.CurrentTabType] = GMCR.CurrentStartNumber[GMCR.CurrentTabType] + GMCR.MaxItemsPerPage - 1;

      //Determine if we can scroll further left
      if (GMCR.CurrentStartNumber[GMCR.CurrentTabType] < GMCR.MaxItemsPerPage) {
        GMCR.ScrollingEnabled[GMCR.CurrentTabType].left = false;
      }
      //change arrows and paging view
      GMCRSelectorLibrary.ResetPagingView();
      GMCRSelectorLibrary.ResetScrollArrows();
    }
  });

  //Handle the adding to the club when the add button is clicked
  $j('img[addid]').live('click', function() {
    GMCR.AddProduct(this, $j(this).attr('addid'));

    // Record event for GA
    pageTracker._trackEvent('K-Cup Browser', 'Add To Cart', $j(this).attr('addid'));
  });

  // set initial values
  GMCR.ShowHideQuickPickSubmitButtons();


  $j("select[addid]").bind("change", function() {
    GMCR.ShowHideQuickPickSubmitButtons();
  });

  $j("select[addid]").each(function() {
    var cb = $j(this).closest('tr').find('input:checkbox');
    cb.bind("click", function(event) {
      if ($j(this).attr('checked')) {
        var selectQty = $j(this).closest('tr').find('select[addid]');
        var qty = parseInt(selectQty.val(), 10);
        if (isNaN(qty) || qty == 0) {
          selectQty.val("1");
          GMCR.ShowHideQuickPickSubmitButtons();
        }
      }
    });
  });
});