/* * Any javascript code necessary to power the top_nav_include file, goes here * */ var M_objGearbagQuantity; var M_objGearbagTotalPrice; var M_objHiddenHolster; var M_objSignIn; var M_objGearbag; var M_objToggleContainer; var M_objMyGear; var M_objHolster; var M_objTray; var myHeight; var myHeight2; var M_objCartWrapper; var M_ToggleOnImgSrc; var M_ToggleOffImgSrc; var M_CheckoutBar; var M_GearbagItems; var M_SavedItems; var M_bIsIframeLoaded = false; var M_objNavWrapper; var M_bShowProductOptions = false; var M_bMenuItemShow = false; var M_resultingPageNoServlet var M_haveResultingPageNoServlet = false; var M_altHolsterEditOption; var M_altHolsterMoveOption; var M_arrTopMenu = new Array( new Array ( "dvNavClothing", "imgClothingOff", false, ""), new Array ( "dvNavSports", "imgSportsOff", false, ""), new Array ( "dvNavActivism", "imgActivismOff", false, "") ,new Array ( "dvNavCampfire", "imgCampfireOff", false, "") ); var M_intArrImgOff = 0; var M_intArrImgOn = 1; var M_bIsOver = 2; var M_intArrTogglePosition = 3; var M_intArrImgOffPosition = 4; var M_bIsMInitialized = false; var M_pntShowDropdowns = function(){}; var M_pntHideDropdowns = function(){}; var M_pntHolsterShowDropdowns = function(){}; var M_pntHolsterHideDropdowns = function(){}; var M_pntPageLevelFunctions = function(){}; var M_objGearBagAjax; var M_strTNPageName = "TopNav.js"; var M_bSetGearSavedImages = false; var M_bIsGearbagRefreshed = false; var M_bIsProdLinkWinOpen = false; var M_pntDoHolster = function(){}; window.onresize = ReloadWindow; /* This code runs if a user resizes their window. */ function ReloadWindow() { try { if( M_bIsMInitialized ) { // If not overridden in a page, this does nothing. Else, it will fire page events we want to happen on window resize M_pntPageLevelFunctions(); } } catch( e ) { HandleError( "ReloadWindow", e, M_strTNPageName ); } } /* Appends an indicator to our id telling us that the item lives in the gearbag function GetGearbagId( strId ) { try { return "dvGear_" + StripHolsterId( strId ); } catch( e ) { HandleError( "GetGearbagId", e, M_strTNPageName ); } } Appends an indicator to our id telling us that the item lives in the saved items function GetSavedId( strId ) { try { return "dvSave_" + StripHolsterId( strId ); } catch( e ) { HandleError( "GetSavedId", e, M_strTNPageName ); } } Checks for an '_' character. If it finds one( RE: dvSaved_99999 ), it takes the piece to the right of it. function StripHolsterId( strId ) { var strReturn; try { strReturn = strId; if( strId.indexOf( "_" ) > 0 ) { strReturn = strId.split( "_" )[1]; } } catch( e ) { HandleError( "StripHolsterId", e, M_strTNPageName ); } return strReturn; } */ /* This method iterates through the items in our TopMenu array, instantiates 'toggler' objects, retracts them and adds them to our array*/ function InitializeTopNav(resultingPage) { try { // Initialize the top nav menu items M_arrTopMenu.each(function(node) { var dvToggle = new fx.Height(node[M_intArrImgOff], {duration: 400}); dvToggle.hide(); node[M_intArrTogglePosition] = dvToggle; }); InitializeHolster(resultingPage); M_bIsMInitialized = true; } catch( e ) { HandleError( "InitializeTopNav", e, M_strTNPageName ); } } /* Gets the position of the image we are overlaying, closes anyother open menu windows and displays the one the user is mousing over*/ function ShowMenuItem( iIndex ) { try { // If we're not initialized - leave if( !M_bIsMInitialized ) return; M_arrTopMenu[iIndex][M_bIsOver] = true; Element.setStyle(M_arrTopMenu[iIndex][M_intArrImgOff],{display:'block'}); M_arrTopMenu[iIndex][M_intArrTogglePosition].toggle(); M_bMenuItemShow = true; // If there are any dropdowns to be hidden on the page, this needs to be overridden at the page level SetTimeout( 'M_pntHideDropdowns();', .5 ); } catch( e ) { HandleError( "ShowMenuItem", e, M_strTNPageName ); } } function CheckEm( intIndex, imgOff, imgOn ) { try { if( !M_bIsMInitialized ) { M_arrTopMenu[intIndex][M_intArrImgOffPosition] = imgOff; return; } //MM_swapImage('imgClothingOff','','/images/structure/en_US/top_nav/btn_clothing_gear_over.gif',1); if( M_arrTopMenu[intIndex][M_intArrTogglePosition].isOpen() ) { KeepMenuItemOpen(intIndex); } else { M_arrTopMenu[intIndex][M_intArrImgOffPosition] = imgOff; MM_swapImage(M_arrTopMenu[intIndex][M_intArrImgOn],'',imgOn,1); ShowMenuItem(intIndex); } } catch( e ) { HandleError( "CheckEm", e, M_strTNPageName ); } } /* Tries to hide a menu item that has been mousedoff. Runs a few checks before it does anything. Although the timer is set to 0, it causes enough of a delay to make this work smoothly. */ function HideMenuItem( iIndex ) { try { // If we're not initialized - leave if( !M_bIsMInitialized ) { return; } /* If we are still off the window and its not in transition, hide it. If window is in transition, make recursive calls to ourselves until layer is fully toggled */ SetTimeout( "if(!M_arrTopMenu["+iIndex +"]["+M_bIsOver+"]){ CloseMenuItem("+iIndex+"); }", 0 ); } catch( e ) { HandleError( "HideMenuItem", e, M_strTNPageName ); } } /* Skip the checks, just close the layer*/ function CloseMenuItem( iIndex ) { try { if( !M_bIsMInitialized ) return; M_arrTopMenu[iIndex][M_intArrTogglePosition].clearTimer(); M_arrTopMenu[iIndex][M_intArrTogglePosition].hide(); // Safari fix - set display to none Element.setStyle(M_arrTopMenu[iIndex][M_intArrImgOff],{display: 'none'}); //$(M_arrTopMenu[iIndex][M_intArrImgOn]).src = M_arrTopMenu[iIndex][M_intArrImgOffPosition]; MM_swapImage(M_arrTopMenu[iIndex][M_intArrImgOn],'',M_arrTopMenu[iIndex][M_intArrImgOffPosition],1); M_pntShowDropdowns(M_arrTopMenu[iIndex][M_intArrImgOff]); } catch( e ) { HandleError( "CloseMenuItem", e, M_strTNPageName ); } } /* To get around mouseoff events firing within our div tag, we turn this flag on and off to let us know if we are really off the div tag*/ function KeepMenuItemOpen( intIndex ) { try { M_bMenuItemShow = true; M_arrTopMenu[intIndex][M_bIsOver] = true; } catch( e ) { HandleError( "KeepMenuItemOpen", e, M_strTNPageName ); } } /* Function gets called when you mouse off the options layer. */ function LetMenuItemClose( intIndex ) { try { M_bMenuItemShow = false; M_arrTopMenu[intIndex][M_bIsOver] = false; HideMenuItem( intIndex ); } catch( e ) { HandleError( "LetMenuItemClose", e, M_strTNPageName ); } } /* Code that needs to happen for our hoslter to work. */ function InitializeHolster(resultingPage) { try { // Set references M_objGearbagQuantity = $("hdnGearQuantity"); M_objGearbagTotalPrice = $("hdnGearTotal"); M_objSavedQuantity = $("hdnSavedQuantity"); M_objHiddenHolster = $("dvHiddenHolster"); M_objSignIn = $("myGearAccountWrapper"); M_objGearbag = $("dvChildHolster"); M_objToggleContainer = $("dvHolster"); M_objMyGear = $("myGear"); M_objHolster = $("holster"); M_objTray = $("dvTray"); M_objCartWrapper = $("dvCartWrapper"); M_CheckoutBar = $("dvCheckoutBar"); M_GearbagItems = $("dvCheckOutItems"); M_SavedItems = $("dvSavedItems"); M_objNavWrapper = $("navWrapper"); M_resultingPage = resultingPage; //Ajax object for updating gear bag M_objGearBagAjax = new AjaxWrapper(); // Set Other Globals var imgGearMin = $("imgMyGearMin"); if( imgGearMin != null ) { M_ToggleOnImgSrc = imgGearMin.getAttribute("src"); } var imgMyGear = $("imgMyGear"); if( imgMyGear != null ) { M_ToggleOffImgSrc = imgMyGear.getAttribute("src"); } // Register toggle menu if( $("dvHolster") != null ) { myHeight = new fx.Height("dvHolster", {duration: 400}); myHeight.hide(); ShowObject( "dvHolster", true ); } if( $("dvSignInToggle") != null ) { myHeight2 = new fx.Height("dvSignInToggle", {duration: 400}); myHeight2.hide(); } IframeOnloadEvent(0); } catch( e ) { HandleError( "InitializeHolster", e, M_strTNPageName ); } } /* Bandaid Code for Holster To Work for Europe */ function SetResultingPageNoServlet(resultingPageNoServlet) { try { M_resultingPageNoServlet = resultingPageNoServlet; M_haveResultingPageNoServlet = true; } catch( e ) { HandleError( "SetResultingPageNoServlet", e, M_strTNPageName ); } } /* used to set the alternate option for the edit cart function in the holster, specifically for order_summary */ function SetAltHolsterEditOption(optionName) { try { M_altHolsterEditOption = optionName; } catch( e ) { HandleError( "SetAltHolsterEditOption", e, M_strTNPageName ); } } /* used to set the alternate option for the move item function in the holster, specifically for order_summary */ function SetAltHolsterMoveOption(optionName) { try { M_altHolsterMoveOption = optionName; } catch( e ) { HandleError( "SetAltHolsterMoveOption", e, M_strTNPageName ); } } /* When the page loads, we need to decide if we put the 'sign in/sign up' links on the holster or the personalized ones. this function sets them and wires them. */ function AssembleAuthenticationLinks() { var bIsUserLoggedIn, ifrData, bIsPublicSite, strPath, strSignInPath, strSignUpPath, strSignInText, strSignUpText, strMaxPath; try { ifrData = window.frames["ifrHolsterInfo"]; bIsPublicSite = true; strPath = "https://www.patagonia.com/web/us"; signedinnameprefix = ""; signedinnamesuffix = "'s Account"; if( ifrData != null ) { bIsUserLoggedIn = Boolean(parseInt(ifrData.document.getElementById( "hdnIsLoggedIn" ).value)); if( bIsUserLoggedIn == true ) { strSignInText = signedinnameprefix + ifrData.document.getElementById( "hdnUserFirstName" ).value + signedinnamesuffix; strSignUpText = ""; strSignInPath = "javascript: DisplaySignIn(true);"; strSignUpPath = "#"; strMaxPath = "javascript: DisplaySignIn(true);"; // Set the account tab var aAccount = $("aAccountName"); if( aAccount != null ) { Element.update(aAccount, strSignInText); } Element.setStyle("plusSymbol", {marginLeft: "14px" }); } // End if is userLoggedIn else { strSignInText = "Sign In"; strSignUpText = "Sign Up"; new Insertion.Before("aAccount", " or "); if( bIsPublicSite ) { strSignInPath = strPath + "/user/login.jsp?target=" + escape(location.protocol + "//www.patagonia.com" + location.pathname + location.search); strSignUpPath = strPath + "/user/reg_form.jsp?target=" + escape(location.protocol + "//www.patagonia.com" + location.pathname + location.search); } // End if is PublicSite else { strSignInPath = strPath + "/pro/user/login.jsp"; strSignUpPath = strPath + "/pro/user/create_account.jsp"; } // End else NOT public site strMaxPath = "#"; Element.setStyle("plusSymbol",{marginLeft: "10px"}); } // End else user IS logged In // Drop in content var aSignIn = $("aSignIn"); aSignIn.setAttribute( "href", strSignInPath ); Element.update(aSignIn, strSignInText); var aSignUp = $("aAccount"); aSignUp.setAttribute( "href", strSignUpPath ); Element.update(aSignUp, strSignUpText); // Set the account tab var aHolsterMax = $("aHolsterMax"); aHolsterMax.setAttribute("href", strMaxPath ); } // End if iframe } catch( e ) { HandleError( "AssembleAuthenticationLinks", e, M_strTNPageName ); } } /* this method checks for the form that is returned from the cart process that builds the holster */ function UpdateQtyAndPriceFromHolsterForm() { var qtyEle, sQtyEle; var priceEle; try { if ($("CurrentCartvars")) { if (qtyEle = $('hdnHolsterCurrentCartQty')) { M_objGearbagQuantity.value = qtyEle.value; } if (priceEle = $('hdnHolsterCurrentCartTotal')) { M_objGearbagTotalPrice.value = priceEle.value; } if (sQtyEle = $('hdnHolsterSavedCartQty')) { M_objSavedQuantity.value = sQtyEle.value; } } } catch (e) { HandleError("UpdateQtyAndPriceFromHolsterForm", e, M_strTNPageName ); } } /* This method fires when pages load. The onload event for the iframe sets the flag to true. If this function fires before our flag has been set, he recursively calls himself a few times waiting for the frame to load. If he never loads, we die grac*/ function IframeOnloadEvent( intCounter ) { var strError = "IFrame still has not loaded."; try { // IFrame has loaded - lets go! if( M_bIsIframeLoaded ) { UpdateTotalsFromIframeOnload(); GetGearSavedImagesOnLoad(); showMergedCartMessage(); AssembleMyGearToggle(); AssembleAuthenticationLinks(); UpdateCheckoutBar(); // Decide which menu gets put in the shopcart toggle bar ChangeGearbagDescriptionVisibility(); return; } // Still waiting on IFrame, increment and try again else if( parseInt(intCounter) <=5 ) { var intCount = parseInt(intCounter) + 1; SetTimeout("IframeOnloadEvent("+ intCount +");", intCount ); } // Done waiting, throw exception else { throw strError; } } catch (e) { HandleError("IframeOnloadEvent", e, M_strTNPageName ); } } function UpdateTotalsFromIframeOnload() { var qtyEle, sQtyEle; var priceEle; try { var ifrAccountData = window.frames["ifrHolsterInfo"]; if ( ifrAccountData != null ) { M_objGearbagQuantity.value = ifrAccountData.document.getElementById( "hdnHolsterCurrentCartQty" ).value; M_objGearbagTotalPrice.value = ifrAccountData.document.getElementById( "hdnHolsterCurrentCartTotal" ).value; M_objSavedQuantity.value = ifrAccountData.document.getElementById( "hdnHolsterSavedCartQty" ).value; } } catch (e) { HandleError("UpdateTotalsFromIframeOnload", e, M_strTNPageName ); } } /* Function which updates the page setting any 'in gear' and 'saved' icons based */ /* on values in the appropriate form */ function GetGearSavedImages() { var currentStyleList = null; var savedStyleList = null; try { if (M_bSetGearSavedImages) { if ($("CurrentCartvars")) { if (styleListEle = $('hdnHolsterCurrentCartStyles')) { currentStyleList = styleListEle.value; } } if ($("SavedCartvars")) { if (styleListEle = $('hdnHolsterSavedCartStyles')) { savedStyleList = styleListEle.value; } } UpdateGearSavedImages( currentStyleList, savedStyleList ); } } catch (e) { HandleError("GetGearSavedImages", e, M_strTNPageName ); } } function UpdateGearSavedImages( currentStyleList, savedStyleList ) { var styleListEle = null; var styleRG = null; var imgEle = null; try { if (M_bSetGearSavedImages) { if (currentStyleList != null) { styleRG = currentStyleList.split(","); for (i = 0; i < styleRG.length; i++) { if ($('in_gear_' + styleRG[i])) { $('in_gear_' + styleRG[i]).style.display = 'block'; } } } if (savedStyleList != null) { styleRG = savedStyleList.split(","); for (i = 0; i < styleRG.length; i++) { if ($('saved_' + styleRG[i])) { $('saved_' + styleRG[i]).style.display = 'block'; } } // End for loop } // End if savedStyleList != null } // End ifbSetGearSavedImages } // End try catch (e) { HandleError("UpdateGearSavedImages", e, M_strTNPageName ); } } /* Function which updates the page setting any 'in gear' and 'saved' icons based */ /* on values in the appropriate form */ function GetGearSavedImagesOnLoad() { var currentStyleList = null; var savedStyleList = null; try { if (M_bSetGearSavedImages) { var ifrAccountData = window.frames["ifrHolsterInfo"]; if ( ifrAccountData != null ) { currentStyleList = ifrAccountData.document.getElementById( "hdnHolsterCurrentCartStyles" ).value; savedStyleList = ifrAccountData.document.getElementById( "hdnHolsterSavedCartStyles" ).value; } UpdateGearSavedImages(currentStyleList, savedStyleList ); } // End big if } catch (e) { HandleError("GetGearSavedImagesOnLoad", e, M_strTNPageName ); } } /* Function to check to see if we should show the merged cart message */ function showMergedCartMessage() { try { var ifrAccountData = window.frames["ifrHolsterInfo"]; if ( ifrAccountData != null ) { if (ifrAccountData.document.getElementById( "hdnHolsterMerged" ).value == 'TRUE') { alert('The contents of your current gear have been updated to include the contents of your order from a previous session that was not completed. Please review the contents of your gear.'); } } } catch (e) { HandleError("showMergedCartMessage", e, M_strTNPageName ); } } /* Function to remove an in gear or saved image */ function removeGearSavedImage(ctype, style) { var prefix = ""; try { if (M_bSetGearSavedImages) { if (ctype == 'CURRENT') { prefix = 'in_gear_'; } else { prefix = 'saved_'; } var objItem = $(prefix + style); if ( objItem != null ) { Element.setStyle(objItem,{display:'none'}); } } } catch (e) { HandleError("removeGearSavedImage", e, M_strTNPageName ); } } /* Set the value that indicates if we should bother working to turn on 'in gear' and 'saved' images */ function setGearSavedImages(value) { M_bSetGearSavedImages = value; } function AssembleMyGearToggle() { try { var intQuantity = parseInt( M_objGearbagQuantity.value ); var intSavedQuantity = parseInt( M_objSavedQuantity.value ); var cacheFlag = ( TrimWhitespace("true").length == 0 ? false : TrimWhitespace("true") ); if( cacheFlag ) { if( !isNaN( intQuantity ) && intQuantity == 0 && !isNaN(intSavedQuantity) && intSavedQuantity == 0) { $("aMyGear").onclick = function() {DisplayHolster(null); return false;}; $("dvMyGearToggle").onclick = function() {DisplayHolster(null);}; } else if( (!isNaN( intQuantity ) && intQuantity > 0) || (!isNaN(intSavedQuantity) && intSavedQuantity > 0) ) { // Has Cart with stuff $("aMyGear").onclick = function() { RefreshGearBagXML(); return false;}; $("dvMyGearToggle").onclick = function() {RefreshGearBagXML();}; } else { // Has No Cart $("aMyGear").onclick = function() { DisplayHolster(null); return false;}; $("dvMyGearToggle").onclick = function() {DisplayHolster(null);}; } } else { $("aMyGear").onclick = function() { DisplayHolster(null); return false;}; $("dvMyGearToggle").onclick = function() {DisplayHolster(null);}; } } catch (e) { HandleError("AssembleHolsterPartDeux", e, M_strTNPageName ); } } /* This method checks the present item quantity. If there are no items in the cart, show the explanation. Otherwise, show the cart*/ function ChangeGearbagDescriptionVisibility() { var objDescription; try { objDescription = $("whatIsMyGear"); if ( (parseInt( M_objGearbagQuantity.getAttribute( "value" ) ) == 0) && (parseInt( M_objSavedQuantity.getAttribute( "value" ) ) == 0) ) { if( objDescription.parentNode == M_objHiddenHolster ) { M_objGearbag.appendChild( objDescription ); M_objHiddenHolster.appendChild( M_objCartWrapper ); } } else { if( objDescription.parentNode != M_objHiddenHolster ) { M_objHiddenHolster.appendChild( objDescription ); M_objGearbag.appendChild( M_objCartWrapper ); } } } catch( e ) { HandleError( "ChangeGearbagDescriptionVisibility", e, M_strTNPageName ); } } /* Swaps out the 'My Gear' image when its clicked on */ function ToggleMyGearImage( bIsExpanded ) { try { $("imgMyGear").setAttribute( "src", ( bIsExpanded ? M_ToggleOnImgSrc : M_ToggleOffImgSrc ) ); } catch( e ) { HandleError( "ToggleMyGearImage", e, M_strTNPageName ); } } /* Hides and shows contents of gearbag */ function DisplayHolster( bMakeVisible ) { try { //if holster is not initialized, do nothing if( !M_bIsMInitialized ) { return; } //check if holster is currently open var bIsHolsterOpen = IsHolsterOpen(); // If directive parameter is null, we are toggling from the top nav // set directve to oposite of current if( bMakeVisible == null) { bMakeVisible = !bIsHolsterOpen; } // set myGear image to same as directive ToggleMyGearImage(bMakeVisible); if( bMakeVisible ) { // Hide other tabs DisplaySignIn( !bMakeVisible ); } // Show gearbag // DisplayCheckoutBar( bMakeVisible ); if ( M_GearbagItems == null || M_SavedItems == null ) { M_GearbagItems = $("dvCheckOutItems"); M_SavedItems = $("dvSavedItems"); } if ( M_GearbagItems != null ) { M_GearbagItems.style.overflow = ( bIsHolsterOpen ? "hidden" : "auto" ); } if ( M_SavedItems != null ) { M_SavedItems.style.overflow = ( bIsHolsterOpen ? "hidden" : "auto" ); } // only toggle if the current state is different than what we want if ( bMakeVisible != bIsHolsterOpen ) { myHeight.toggle(); bMakeVisible ? M_pntHolsterHideDropdowns() : M_pntHolsterShowDropdowns(); } } catch( e ) { HandleError( "DisplayHolster", e, M_strTNPageName ); } } /* Rolls out the sign in tab. This may go away since cannot sign in securely through holster.*/ function DisplaySignIn( bMakeVisible ) { var objOldParent, objNewParent; try { // If not initialized, leave. if( !M_bIsMInitialized ) { return; } if( bMakeVisible ) { // Hide gearbag holster HideHolster(); // Show sign in form ShowObject( M_objSignIn, true ); ToggleSignInToggler(); } else { HideSignInToggler(); ShowObject( M_objSignIn, false ); DisplayCheckoutBar( true ); } } catch( e ) { HandleError( "DisplaySignIn", e, M_strTNPageName ); } } /* Adjusts visibility of checkout bar. */ function DisplayCheckoutBar( bShowBar ) { try { if( Element.getStyle(M_CheckoutBar, "display") == "block" ) { ShowCheckoutBar( bShowBar ); } } catch( e ) { HandleError( "DisplayCheckoutBar", e, M_strTNPageName ); } } function ShowCheckoutBar( bShowBar ) { try { //ShowObject( "dvCheckoutBar", bShowBar ); if(bShowBar) { Element.setStyle(M_CheckoutBar, {display:'block'}); Element.setStyle(M_objToggleContainer, {top: '30px'}); } else { Element.setStyle(M_CheckoutBar, {display:'none'}); Element.setStyle(M_objToggleContainer, {top: '0px'}); } } catch( e ) { HandleError( "ShowCheckoutBar", e, M_strTNPageName ); } } /* Checks to see if holster is open or not. */ function IsHolsterOpen() { try { return myHeight.isOpen(); } catch( e ) { HandleError( "IsHolsterOpen", e, M_strTNPageName ); } } /* Hides holster and sign in tab if its open. */ function HideAllHolsters() { try { HideHolster(); DisplaySignIn( false ); } catch( e ) { HandleError( "HideAllHolsters", e, M_strTNPageName ); } } /* Hides holster. */ function HideHolster() { try { ToggleMyGearImage( false ); myHeight.hide(); } catch( e ) { HandleError( "HideHolster", e, M_strTNPageName ); } } /* Toggles sign-in tab */ function ToggleSignInToggler() { try { myHeight2.toggle(); } catch( e ) { HandleError( "ToggleSignInToggler", e, M_strTNPageName ); } } /* Checks to see if sign in tab is expanded or not. */ function IsSignInTogglerOpen() { try { return myHeight2.isOpen(); } catch( e ) { HandleError( "IsSignInTogglerOpen", e, M_strTNPageName ); } } /* Hides sign in tab. */ function HideSignInToggler() { try { myHeight2.hide(); } catch( e ) { HandleError( "HideSignInToggler", e, M_strTNPageName ); } } /* We know the item already exists, so get the quantity tag and update it. */ function UpdateGearItemQuantity( strReferenceId, iQuantity ) { var objQuantity, iOldQuantity = 0; try { objQuantity = $("spQty_" + strReferenceId); if( objQuantity != null ) { iOldQuantity = parseInt( objQuantity.innerHTML ); objQuantity.innerHTML = ( iOldQuantity + iQuantity ); } } catch( e ) { HandleError( "UpdateGearItemQuantity", e, M_strTNPageName ); } } /* Adds or removes the view all bar from the gearbag */ function DisplayViewAllGearBar( bDisplay ) { var objDiv, objA, objDivAll; try { objDivAll = $("dvGearViewAll"); // If we need to display the bar and its not presently being displayed, display it if( bDisplay && ( objDivAll == null ) ) { objDiv = document.createElement( "div" ); objDiv.setAttribute( "id", "dvGearViewAll" ); objDiv.className = "viewAll"; objA = document.createElement( "a" ); objA.setAttribute( "href", "javascript:;" ); objA.appendChild( document.createTextNode( "View all" ) ); objDiv.appendChild( objA ); M_GearbagItems.appendChild( objDiv ); } // If we need to hide the bar, and its currently visible and there are no more gear items, hide it else if( !bDisplay && !HasGearItems() && ( objDivAll != null ) ) { objDivAll.parentNode.removeChild( objDivAll ); } else {} } catch( e ) { HandleError( "AddViewAllBar", e, M_strTNPageName ); } } /* Adds or removes the view all bar from the saved items */ function DisplayViewAllSaved( bDisplay ) { var objDiv, objA, objDivAll; try { objDivAll = $("dvSavedViewAll"); // If we need to display the bar and its not presently being displayed, display it if( bDisplay && ( objDivAll == null ) ) { objDiv = document.createElement( "div" ); objDiv.setAttribute( "id", "dvSavedViewAll" ); objDiv.className = "viewAll"; objA = document.createElement( "a" ); objA.setAttribute( "href", "javascript:;" ); objA.appendChild( document.createTextNode( "View all" ) ); objDiv.appendChild( objA ); M_SavedItems.appendChild( objDiv ); } // If we need to hide the bar, and its currently visible and there are no more gear items, hide it else if( !bDisplay && !HasGearItems() && ( objDivAll != null ) ) { objDivAll.parentNode.removeChild( objDivAll ); } else {} } catch( e ) { HandleError( "AddViewAllBar", e, M_strTNPageName ); } } var activeHolsterItemId; var activeHolsterReferenceId; /* When user hovers over saved items we show them this list of options */ function ShowItemOptionsII( cartId, referenceId, colorCode, skuRefId, quantity, ctype, hasRelProducts, userIsLoggedIn, pType, price, webSpecial, orderId) { //alert("ShowItemOptionsII : cartId = " + cartId + " referenceId = " + referenceId + " colorCode = " + colorCode + " quantity = " + quantity + " ctype = " + ctype + " hasRelProducts = " + hasRelProducts + " userIsLoggedIn = " + userIsLoggedIn ); try { //set the active Items to use when someone clicks an item activeHolsterItemId = cartId; activeHolsterReferenceId = referenceId; var dvItem = $("dvGear_" + cartId); var objDiv = $("dvGearOption"); SetObjectPosition( objDiv, ( GetBasePositionX() + 475 ), ( M_iMouseY - 50 ) ); // Wire up the links arrA = objDiv.getElementsByTagName( "a" ); // Evaluate which part of the holster we're in and format options accordingly //WORK ON getting the saved items plummed right later. For now, just do the WireGearbagItemEvents( arrA, cartId, referenceId, colorCode, skuRefId, quantity, ctype, hasRelProducts, userIsLoggedIn, pType, price, webSpecial, orderId); ShowObject( objDiv, true ); } catch( e ) { HandleError( "ShowItemOptionsII", e, "TopNavII.js" ); } } /* This is how we keep the product options floating layer alive*/ function KeepOptionsOpen() { try { M_bShowProductOptions = true; } catch( e ) { HandleError( "KeepOptionsOpen", e, M_strTNPageName ); } } /* Function gets called when you mouse off the options layer. */ function LetOptionsClose( bIsCheckout ) { try { M_bShowProductOptions = false; HideItemOptions(); } catch( e ) { HandleError( "LetOptionsClose", e, M_strTNPageName ); } } /* Hides options associated with items in a cart*/ function HideItemOptions( bIsCheckout ) { try { if( M_bShowProductOptions ) return; SetTimeout( "if(!M_bShowProductOptions) ForceCloseItemOptions();", 2 ); } catch( e ) { HandleError( "HideItemOptions", e, M_strTNPageName ); } } /* Hides options associated with items in a cart*/ function ForceCloseItemOptions() { try { ShowObject( $("dvGearOption"), false ); } catch( e ) { HandleError( "ForceCloseItemOptions", e, M_strTNPageName ); } } var activeViewAllItemId; var activeViewAllReferenceId; /* When user hovers over saved items we show them this list of options */ function ShowItemOptionsViewAll( cartId, referenceId, colorCode, skuRefId, quantity, ctype, hasRelProducts, userIsLoggedIn, pType, price, webSpecial, orderId) { //alert("ShowItemOptionsViewAll : cartId = " + cartId + " referenceId = " + referenceId + " colorCode = " + colorCode + " quantity = " + quantity + " ctype = " + ctype + " hasRelProducts = " + hasRelProducts + " userIsLoggedIn = " + userIsLoggedIn ); try { //set the active Items to use when someone clicks an item activeViewAllItemId = cartId; activeViewAllReferenceId = referenceId; var dvItem = $("dv_ViewAll_" + cartId); var objDiv = $("dvGearOption"); var objPos = GetObjectPosition(dvItem); SetObjectPosition(objDiv, (objPos.x), (objPos.y - 50)); objDiv.style.zIndex = 6; // Wire up the links arrA = objDiv.getElementsByTagName( "a" ); WireGearbagItemEvents( arrA, cartId, referenceId, colorCode, skuRefId, quantity, ctype, hasRelProducts, userIsLoggedIn, pType, price, webSpecial, orderId); ShowObject( objDiv, true ); } catch( e ) { HandleError( "ShowItemOptionsViewAll", e, "TopNav.js" ); } } /* Manipulate the options layer for gearbag items. */ function WireGearbagItemEvents( arrA, cartId, referenceId, colorCode, skuRefId, quantity, ctype, hasRelProducts, userIsLoggedIn, pType, price, webSpecial, orderId) { // alert("WireGearbagItemEvents : webSpecial = "+ webSpecial ); try { if( !M_bIsMInitialized ) return; if (webSpecial == null || webSpecial == '') { webSpecial = false; } //alert("" + arrA.length + " cartId:" + cartId + " referenceId:" + referenceId + " color:" + color); //compare if (pType != 'GIFTCARD') { arrA[0].setAttribute( "href", "/web/us/product/product_compare.jsp?OPTION=PRODUCT_COMPARE_DISPLAY_HANDLER&action=add&style_color=" + referenceId + "-" + colorCode+ "&ws=" + webSpecial ); arrA[0].innerHTML = "Compare"; } else { arrA[0].setAttribute( "href", "javascript;"); arrA[0].innerHTML = ""; } //Save For Later if(ctype == 'CURRENT') { if ( userIsLoggedIn ) { arrA[1].setAttribute("href","javascript: MoveWithinGearBagXML(" + cartId + ",'CURRENT','SAVED','" + referenceId + "'); ForceCloseItemOptions();"); } else { arrA[1].setAttribute("href","https://www.patagonia.com/web/us/user/login.jsp?saveCartItemForLater=" + cartId + "&target=" + escape("https://www.patagonia.com" + location.pathname + location.search)); } arrA[1].innerHTML = "Save For Later"; } else { arrA[1].setAttribute("href","javascript: MoveWithinGearBagXML(" + cartId + ",'SAVED','CURRENT','" + referenceId + "'); ForceCloseItemOptions();"); arrA[1].innerHTML = "Move to Gear Bag"; } var onProductFocus = false; if (location.pathname != null && location.pathname.indexOf('product_focus.jsp') != (-1)) { onProductFocus = true; } //View Product Details if (pType != 'GIFTCARD') { if (!onProductFocus && BrowserInfo.showPFW()) { arrA[2].setAttribute("href","javascript:ShowDetail('" + referenceId + "','" + colorCode + "','" + skuRefId + "','" + quantity + "','" + cartId + "',0,'" + M_resultingPage + "',"+webSpecial+",'"+ctype+"'); ForceCloseItemOptions();"); } else { arrA[2].setAttribute("href","/web/us/product/product_focus.jsp?OPTION=PRODUCT_FOCUS_DISPLAY_HANDLER&style_color=" + referenceId + "-" + colorCode + "&skuRefId=" + skuRefId + "&quantity=" + quantity+ "&cartId=" + cartId+ "&ws=" + webSpecial+ "&cartType=" + ctype); } } else { arrA[2].setAttribute("href","/web/us/product/gift_card_page.jsp?zoi_id-1=" + cartId + "&zoi_quantity-1=" + quantity + "&zoi_price-1=" + price + "&zoi_product-1=" + referenceId + "&zoi_sku-1=" + skuRefId); } //this set attribut doesn't seem to work in IE? arrA[2].innerHTML = "View Product Details"; //Edit size, color or qty. if (pType != 'GIFTCARD') { if (!onProductFocus && BrowserInfo.showPFW()) { // also check for alternative options in thi section if (M_altHolsterEditOption == null) { arrA[3].setAttribute("href","javascript:ShowDetail('" + referenceId + "','" + colorCode + "','" + skuRefId + "','" + quantity + "','" + cartId + "',0,'" + M_resultingPage + "',"+webSpecial+",'"+ctype+"'); ForceCloseItemOptions();"); } else { arrA[3].setAttribute("href","javascript:ShowDetail('" + referenceId + "','" + colorCode + "','" + skuRefId + "','" + quantity + "','" + cartId + "',0,'" + M_resultingPage + "?OPTION=" + M_altHolsterEditOption + "'," + webSpecial + ",'"+ctype+"'); ForceCloseItemOptions();"); } } else { arrA[3].setAttribute("href","/web/us/product/product_focus.jsp?OPTION=PRODUCT_FOCUS_DISPLAY_HANDLER&style_color=" + referenceId + "-" + colorCode + "&skuRefId=" + skuRefId + "&quantity=" + quantity+ "&cartId=" + cartId+ "&ws=" + webSpecial+ "&cartType=" + ctype); } } else { arrA[3].setAttribute("href","/web/us/product/gift_card_page.jsp?zoi_id-1=" + cartId + "&zoi_quantity-1=" + quantity + "&zoi_price-1=" + price + "&zoi_product-1=" + referenceId + "&zoi_sku-1=" + skuRefId); } //this set attribut doesn't seem to work in IE? arrA[3].innerHTML = "Edit size, color or qty."; //needed to add this check and reset the webSpecial var to a boolean explicitly, since it wasn't always a boolean //coming into this method. if ( hasRelProducts ) { //See related items //arrA[4].setAttribute("href","#sku." + referenceId); if ( webSpecial == "true" ) { arrA[4].setAttribute( "href", "javascript;"); arrA[4].innerHTML = ""; } else { if (!onProductFocus && BrowserInfo.showPFW()) { arrA[4].setAttribute("href","javascript:ShowDetail('" + referenceId + "','" + colorCode + "','" + skuRefId + "','" + quantity + "','" + cartId + "',3" + ",'" + M_resultingPage + "',"+webSpecial+",'"+ctype+"'); ForceCloseItemOptions();"); } else { arrA[4].setAttribute("href","/web/us/product/product_focus.jsp?OPTION=PRODUCT_FOCUS_DISPLAY_HANDLER&style_color=" + referenceId + "-" + colorCode + "&skuRefId=" + skuRefId + "&quantity=" + quantity+ "&cartId=" + cartId + "&intTab=3"+ "&cartType=" + ctype); } //this set attribut doesn't seem to work in IE? //arrA[4].setAttribute("onClick","ShowDetail('" + referenceId + "','" + colorCode + "','" + skuRefId + "','" + quantity + "','" + cartId + "',3" + ",'" + M_resultingPage + "');"); arrA[4].innerHTML = "See related items"; } } else { arrA[4].setAttribute( "href", "javascript;"); arrA[4].innerHTML = ""; } //remove from cart if ( M_resultingPage != null && M_resultingPage != '' ) { if (ctype == 'CURRENT') { if(M_haveResultingPageNoServlet) { if (M_altHolsterEditOption == null) { arrA[5].setAttribute("href", "/web/us" + M_resultingPageNoServlet + "?OPTION=EDITCART&zoi_save=1&zoi_id-1=" + cartId + "&zoi_delete-1=true"); } else { arrA[5].setAttribute("href", "/web/us" + M_resultingPageNoServlet + "?OPTION=" + M_altHolsterEditOption + "&zoi_save=1&zoi_id-1=" + cartId + "&zoi_delete-1=true"); } } else { if (M_altHolsterEditOption == null) { arrA[5].setAttribute("href", "/web/us" + M_resultingPage + "?OPTION=EDITCART&zoi_save=1&zoi_id-1=" + cartId + "&zoi_delete-1=true"); } else { arrA[5].setAttribute("href", "/web/us" + M_resultingPage + "?OPTION=" + M_altHolsterEditOption + "&zoi_save=1&zoi_id-1=" + cartId + "&zoi_delete-1=true"); } } } else { arrA[5].setAttribute("href", "/web/us" + M_resultingPage + "?OPTION=EDIT_SAVED_ORDER&zoi_save=1&zoi_id-1=" + cartId + "&zoi_delete-1=true&zo_id=" + orderId); } } else { arrA[5].setAttribute("href","javascript: RemoveFromGearBagXML(" + cartId + ",'" + ctype + "', '" + referenceId + "'); ForceCloseItemOptions();"); } arrA[5].innerHTML = "Remove"; } catch( e ) { HandleError( "WireGearbagItemEvents", e, M_strTNPageName ); } } /* Generates footer text based on availability */ function CreateFooterText( strAvailabilityStatus, strDate ) { var strText = ""; try { switch( strAvailabilityStatus ) { case M_IN_STOCK: strText = "In Stock: usually ships in 1 business day"; break; case M_BACKORDERED: strText = "Back Order: estimated ship date " + FormatDateForFooter( strDate ); break; default: break; } } catch( e ) { HandleError( "CreateFooterText", e, M_strTNPageName ); } return strText; } /* Date we get back in xml is not formatted as they would like it in the footer, so we do that here. */ function FormatDateForFooter( strOldDate ) { var strDate = ""; try { var arrDate = strOldDate.split( "-" ); strDate = arrDate[1] + "/" + arrDate[2] + "/" + arrDate[0]; } catch( e ) { HandleError( "FormatDateForFooter", e, M_strTNPageName ); } return strDate; } /* Evaluates the availability status, and sets the class name for the footer */ function CreateFooterClassValue( strAvailabilityStatus ) { var strStatus = "productFooter"; try { switch( strAvailabilityStatus ) { case M_IN_STOCK: strStatus += " productInstock"; break; case M_BACKORDERED: strStatus += " productBackordered"; break; default: break; } } catch( e ) { HandleError( "CreateFooterClassValue", e, M_strTNPageName ); } return strStatus; } /* Updates the quantity and price fields in the checkout bar.*/ function UpdateCheckoutBar(message) { var countAndTotal; var objDescText, objBar, objCheckImgProgress; try { objDescText = $("spCheckoutItemCountAndTotal"); objCheckImgProgress = $("imgCheckoutLoading"); objMyGear = $("myGear"); objMyGearPos = GetObjectPosition(objMyGear); if ( message != null && message != "" ) { //objDescText.innerHTML = message; Element.setStyle(objDescText,{display:'none'}); Element.show(objCheckImgProgress); Element.update(objDescText, ""); ShowCheckoutBar( true ); return; } var onShippingBillingPaymentPage = false; if (location.pathname != null && (location.pathname.indexOf('shipping.jsp') != (-1) || location.pathname.indexOf('shopcart.jsp') != (-1) || location.pathname.indexOf('qas_prompt.jsp') != (-1) || location.pathname.indexOf('billing.jsp') != (-1)|| location.pathname.indexOf('order_summary.jsp') != (-1) || location.pathname.indexOf('payment.jsp') != (-1) )) { onShippingBillingPaymentPage = true; } Element.hide(objCheckImgProgress); Element.setStyle(objDescText,{display:'block'}); if ( M_objGearbagQuantity.getAttribute( "value" ) != "0" && M_objGearbagQuantity.getAttribute( "value" ) != "" && !onShippingBillingPaymentPage) { $("checkoutBtn").src = '/images/structure/en_US/top_nav/btn_checkout.gif'; countAndTotal = M_objGearbagQuantity.getAttribute("value"); countAndTotal += " " + "items ready to go" + " ("; countAndTotal += M_objGearbagTotalPrice.getAttribute("value"); countAndTotal += ")"; Element.update(objDescText, countAndTotal); ShowCheckoutBar( true ); } else { Element.update(objDescText, "Your gearbag is empty"); ShowCheckoutBar( false ); } } catch( e ) { HandleError( "UpdateCheckoutBar", e, M_strTNPageName ); } } /* Checks hidden field for quantity of items in the gear section */ function HasGearItems() { var bHasGear = false; try { bHasGear = ( parseInt( M_objGearbagQuantity.getAttribute( "value" ) ) > 0 ); } catch( e ) { HandleError( "HasGearItems", e, M_strTNPageName ); } return bHasGear; } /* Checks hidden field for quantity of items in the saved section */ function HasSavedItems() { var bHasSavedItems = false; try { bHasSavedItems = ( parseInt( M_objSavedQuantity.getAttribute( "value" ) ) > 0 ); } catch( e ) { HandleError( "HasSavedItems", e, M_strTNPageName ); } return bHasSavedItems; } var APOS = "'"; var QUOTE = '"'; var ESCAPED_QUOTE = { } ESCAPED_QUOTE[QUOTE] = '"'; ESCAPED_QUOTE[APOS] = '''; // XML writer with attributes and smart attribute quote escaping function XElement(name,content,attributes) { var att_str = ''; if (attributes) { // tests false if this arg is missing! att_str = XFormatAttributes(attributes); } var xml; if (!content) { xml='<' + name + att_str + '/>\n'; } else { xml='<' + name + att_str + '>' + content + '\n'; } return xml; } /* Format a dictionary of attributes into a string suitable for inserting into the start tag of an element. Be smart about escaping embedded quotes in the attribute values. */ function XFormatAttributes(attributes) { var att_value; var apos_pos, quot_pos; var use_quote, escape, quote_to_escape; var att_str; var re; var result = ''; for (var att in attributes) { att_value = attributes[att]; // Find first quote marks if any apos_pos = att_value.indexOf(APOS); quot_pos = att_value.indexOf(QUOTE); // Determine which quote type to use around // the attribute value if (apos_pos == -1 && quot_pos == -1) { att_str = ' ' + att + "='" + att_value + "'"; result += att_str; continue; } // Prefer the single quote unless forced to use double if (quot_pos != -1 && quot_pos < apos_pos) { use_quote = APOS; } else { use_quote = QUOTE; } // Figure out which kind of quote to escape // Use nice dictionary instead of yucky if-else nests escape = ESCAPED_QUOTE[use_quote]; // Escape only the right kind of quote re = new RegExp(use_quote,'g'); att_str = ' ' + att + '=' + use_quote + att_value.replace(re, escape) + use_quote; result += att_str; } return result; } function BuildCartModifyMsg(todo,cartid,otype,style,sku,qty,price,spec) { try { var strMessage = "\n"; strMessage += XElement("ModifyOrderItems", XElement("Items", XElement("Item", XElement("id",cartid) + XElement("order_type",otype) + XElement("style",style) + XElement("short_sku",sku) + XElement("quantity",qty) + XElement("price",price) + XElement("web_special",spec) + XElement("cat_code","") ,{action:todo} ) ) ); return strMessage; } catch( e ) { HandleError( "BuildCartModifyMsg", e, M_strTNPageName ); } } function BuildCartMoveMsg(cartid,oTypeFrom,oTypeTo) { try { var strMessage = "\n"; strMessage += XElement("MoveOrderItems", XElement("Items", XElement("Item", XElement("id",cartid) + XElement("from_order_type",oTypeFrom) + XElement("to_order_type",oTypeTo) ) ) ); return strMessage; } catch( e ) { HandleError( "BuildCartMoveMsg", e, M_strTNPageName ); } } function BuildCartRetrieveMsg() { try { var strMessage = "\n"; strMessage += XElement("RetrieveOrder"); // alert(strMessage); return strMessage; } catch( e ) { HandleError( "BuildCartRetrieveMsg", e, M_strTNPageName ); } } /* When we get a response for the holster, this function takes the response data and tries to drop it in. To check for errors, we check for the presence of a node that will only be there if we get a successful response. */ function RefreshHolsterWithNewAJAX(objMyAjax) { try { Element.update("dvCartWrapper", objMyAjax.getResponseText()); UpdateQtyAndPriceFromHolsterForm(); GetGearSavedImages(); ChangeGearbagDescriptionVisibility(); UpdateCheckoutBar(); if ( HasGearItems() || HasSavedItems() ) { DisplayHolster(null); } } catch( e ) { HandleError( "RefreshHolsterWithNewAJAX", e, M_strTNPageName ); } } /* We lazy load holster. Get it first time requested, then toggle it from then on*/ function RefreshGearBagXML() { try { if( !M_bIsGearbagRefreshed ) { // if the holster is currently open, just close it if (IsHolsterOpen()) { DisplayHolster(false); } else { //AddCheckoutBar(); UpdateCheckoutBar("Communicating with server..."); HideHolster(); M_objGearBagAjax.refreshObject(); M_objGearBagAjax.setIsXml(true); M_objGearBagAjax.setDestinationPath( "/web/us" ); M_objGearBagAjax.appendRequestData( "OPTION", "XML_MESSAGE_HANDLER" ); var strMessage = BuildCartRetrieveMsg(); //alert(strMessage); M_objGearBagAjax.appendRequestData( "XML", strMessage ); M_objGearBagAjax.appendRequestData( "convertToHTML","true"); M_objGearBagAjax.startRequest(); M_objGearBagAjax.onRequestComplete = function() { RefreshHolsterWithNewAJAX(M_objGearBagAjax); } // Flip our flag M_bIsGearbagRefreshed = true; } } // End if gearbag is not refreshed else { // We already got the gearbag - just toggle it now DisplayHolster( null ); } } catch ( e ) { HandleError( "RefreshGearBagXML", e, M_strTNPageName ); } } function RemoveFromGearBagXML(cartId, ctype, style) { try { //AddCheckoutBar(); UpdateCheckoutBar("Communicating with server..."); HideHolster(); var objHdnField = $("dvHdn_" + cartId); var strHiddenText = ""; if( objHdnField != null ) { strHiddenText = objHdnField.innerHTML; } M_objGearBagAjax.refreshObject(); M_objGearBagAjax.setIsXml(true); M_objGearBagAjax.setDestinationPath( "/web/us" ); M_objGearBagAjax.appendRequestData( "OPTION", "XML_MESSAGE_HANDLER" ); var strMessage = BuildCartModifyMsg("delete",cartId,ctype,"","","","",""); //alert(strMessage); M_objGearBagAjax.appendRequestData( "XML", strMessage ); M_objGearBagAjax.appendRequestData( "convertToHTML","true"); M_objGearBagAjax.startRequest(); M_objGearBagAjax.onRequestComplete = function() { RefreshHolsterWithNewAJAX(M_objGearBagAjax); removeGearSavedImage(ctype, style); if ( !HasGearItems() && !HasSavedItems() ) { M_pntHolsterShowDropdowns(); } if( strHiddenText.length > 0 ) { RecordOmnitureRemoveEvent( strHiddenText, ctype ); } } M_objGearBagAjax.onRequestError = function() {} } catch ( e ) { HandleError( "RemoveFromGearBagXML", e, M_strTNPageName ); } } /* When at item is moved from gearbag to saved or vice versa, we record it here */ function RecordOmnitureRemoveEvent( strProductText, strType ) { try { var objOmniture; if( strProductText.length > 0 ) { switch( strType ) { case "CURRENT": objOmniture = new OmnitureHelper( "Item removed from GEARBAG" ); objOmniture.setProducts( strProductText ); objOmniture.removeFromGearbag(); break; case "SAVED": objOmniture = new OmnitureHelper( "Item removed from SAVED" ); objOmniture.setProducts( strProductText ); objOmniture.removeFromSaved(); break; default: break; } objOmniuture = null; } } catch ( e ) { HandleError( "RecordOmnitureRemoveEvent", e, M_strTNPageName ); } } function MoveWithinGearBagXML(cartId,currentLocation,newLocation,style) { try { var strMessage = BuildCartMoveMsg(cartId,currentLocation,newLocation); var objHdnText = $("dvHdn_" + cartId); var strHdnText = ""; if( objHdnText != null ) { strHdnText = objHdnText.innerHTML; } if ( M_resultingPage != null && M_resultingPage != '' ) { $('imf_hid_XML').value = strMessage; $('imf_hid_returnJSPPage').value = M_resultingPage; if (M_altHolsterMoveOption != null) { $('imf_hid_OPTION').value = M_altHolsterMoveOption; } document.forms['itemmoveform'].submit(); } else { //AddCheckoutBar(); UpdateCheckoutBar("Communicating with server..."); HideHolster(); M_objGearBagAjax.refreshObject(); M_objGearBagAjax.setIsXml(true); M_objGearBagAjax.setDestinationPath( "/web/us" ); M_objGearBagAjax.appendRequestData( "OPTION", "XML_MESSAGE_HANDLER" ); //alert(strMessage); M_objGearBagAjax.appendRequestData( "XML", strMessage ); M_objGearBagAjax.appendRequestData( "convertToHTML","true"); M_objGearBagAjax.startRequest(); M_objGearBagAjax.onRequestComplete = function() { RefreshHolsterWithNewAJAX(M_objGearBagAjax); removeGearSavedImage(currentLocation, style); if( strHdnText.length > 0 ) { RecordOmnitureMovedEvent( strHdnText, newLocation ); } } M_objGearBagAjax.onRequestError = function() {} } } catch ( e ) { HandleError( "MoveWithinGearBagXML", e, M_strTNPageName ); } } /* When at item is moved from gearbag to saved or vice versa, we record it here */ function RecordOmnitureMovedEvent( strProductText, strTo ) { try { var objOmniture; if( strProductText.length > 0 ) { //SAVED switch( strTo ) { case "CURRENT": objOmniture = new OmnitureHelper( "Item moved within holster from SAVED to GEARBAG" ); objOmniture.setProducts( strProductText ); objOmniture.moveSavedToGearbag(); break; case "SAVED": objOmniture = new OmnitureHelper( "Item moved within holster from GEARBAG to SAVED" ); objOmniture.setProducts( strProductText ); objOmniture.moveGearbagToSaved(); break; default: break; } objOmniuture = null; } } catch ( e ) { HandleError( "RecordOmnitureMovedEvent", e, M_strTNPageName ); } } function FlagProdLinkWindowOpen(isOpen) { try { M_bIsProdLinkWinOpen = isOpen; } catch(e) { HandleError( "FlagProdLinkWindowOpen", e, M_strTNPageName ); } } function AddReloadForm() { try { var frm = document.createElement("form"); frm.setAttribute("name", "itemupdateform"); frm.setAttribute("id", "itemupdateform"); frm.setAttribute("action", "/web/us"); frm.setAttribute("method", "post"); var input1 = document.createElement("input"); input1.setAttribute("type", "hidden"); input1.setAttribute("name", "OPTION"); input1.setAttribute("value", "XML_MESSAGE_HANDLER"); var input2 = document.createElement("input"); input2.setAttribute("type", "hidden"); input2.setAttribute("name", "XML"); input2.setAttribute("id", "iuf_hid_XML"); var input3 = document.createElement("input"); input3.setAttribute("type", "hidden"); input3.setAttribute("name", "returnJSPPage"); input3.setAttribute("id", "iuf_hid_returnJSPPage"); input3.setAttribute("value", ""); frm.appendChild(input1); frm.appendChild(input2); frm.appendChild(input3); $("productOptions").appendChild(frm); } catch(e) { HandleError( "AddReloadForm", e, M_strTNPageName ); } } /* This function is called when we want to add product(s) to the gearbag */ function AddItemToCartMulti(formName, productIndex, webSpecial, resultingPage) { try { var objValidator = ValidateProductToAdd( formName, productIndex ); var productName = $('hdnDescription' + productIndex).value; var bDoP2P = IsSectionP2P(productIndex); // Need to select a valid size and color if( objValidator == null || !objValidator.isValid ) { //var errorMessage = 'Please select a size.'; HandleProductAddValidationError( productIndex ); return false; } if(M_bIsPToP && bDoP2P) { var prodName = productName.replace(/&/g, "*"); prodName = prodName.replace(/®/g, "YCYC"); var strParams = "?st=" + objValidator.status + "&sku=" + objValidator.sku + "&dt=" + objValidator.availDate + "&sl=" + M_strStyleNum + "&conm=" + objValidator.color + "&d=" + prodName + "&cnm=" + objValidator.colorDesc + "&sz=" + objValidator.sizeDesc + "&m=A&md=A"; // trying to add SOLD OUT or CHASE item to gearbag from product layer or page if (objValidator.status == "OOS" || objValidator.status == "ISR") { DoP2PWin(strParams); return false; } // trying to add BACKORDER status item to gearbag from product layer or page if (objValidator.status == "BO" && !M_bIsProdLinkWinOpen) { M_pntDoHolster = function() { AddItemToCartMulti(formName, productIndex, webSpecial, location.pathname + location.search); } DoP2PWin(strParams); return false; } } // end if p2p // else not p2p else { // Sold out, no P2P if (objValidator.status == "OOS") { var outOfStockMessage = "The size/color you've chosen is currently out of stock in our online store."; alert(outOfStockMessage); return false; } // Launch Chase if (objValidator.status == "ISR") { popUp('/web/us' + '/includes/retail_inventory_pop_up.jsp?productName='+productName,'win','width=400,height=300'); return false; } } // end else not p2p // Clear out any errors. ClearProductAddValidationErrors(); // add code here to check selection and complain var sku = objValidator.sku; var qty = objValidator.quantity; var price = $F('price' + productIndex); var description = $F('hdnDescription' + productIndex); var strSizDesc = objValidator.sizeDesc; var strMessage = BuildCartModifyMsg("add","","CURRENT",M_strStyleNum,sku,qty,price,webSpecial); // Clear out any errors. if ( !IsEmpty(resultingPage)) { $("iuf_hid_XML").value = strMessage; $("iuf_hid_returnJSPPage").value = resultingPage; $("itemupdateform").submit(); } else { //AddCheckoutBar(); UpdateCheckoutBar("Communicating with server..."); HideHolster(); M_objGearBagAjax.refreshObject(); M_objGearBagAjax.setIsXml(true); M_objGearBagAjax.setDestinationPath( "/web/us" ); M_objGearBagAjax.appendRequestData( "OPTION", "XML_MESSAGE_HANDLER" ); M_objGearBagAjax.appendRequestData( "XML", strMessage ); M_objGearBagAjax.appendRequestData( "convertToHTML","true"); M_objGearBagAjax.startRequest(); M_objGearBagAjax.onRequestComplete = function() { RefreshHolsterWithNewAJAX(M_objGearBagAjax); // Record this event CallOmnitureAddGearbag( description, strSizDesc, qty, webSpecial, price, sku, objValidator.color, M_strStyleNum ); } // Dereference pointer M_pntDoHolster = function() {} //need to return true if we passed the validation etc. so that we can know to close the Product Focus Window return true; } } catch( e ) { HandleError( "AddItemToCartMulti", e, M_strTNPageName ); } } /* Launches p2p window */ function LaunchOnlinePartnersAdd(formName, productIndex, webSpecial, resultingPage) { try { var objValidator = ValidateProductToAdd( formName, productIndex ); // Need to select a valid size and color if( objValidator == null || !objValidator.isValid ) { //var errorMessage = 'Please select a size.'; HandleProductAddValidationError( productIndex ); return false; } // Selection is valid, build status string var prodName = ($('hdnDescription' + productIndex).value).replace(/&/g, "*"); prodName = prodName.replace(/®/g, "YCYC"); var strParams = "?st=" + objValidator.status + "&sku=" + objValidator.sku + "&dt=" + objValidator.availDate + "&sl=" + M_strStyleNum + "&conm=" + objValidator.color + "&d=" + prodName + "&cnm=" + objValidator.colorDesc + "&sz=" + objValidator.sizeDesc + "&m=A&md=B";; // If in stock or backordered, wire pointer if(objValidator.status == "BO" || objValidator.status == "IS") { M_pntDoHolster = function() { AddItemToCartMulti(formName, productIndex, webSpecial, location.pathname + location.search); } } // Launch window DoP2PWin(strParams); } catch( e ) { HandleError( "LaunchOnlinePartnersAdd", e, M_strTNPageName ); } } /* Launches p2p window */ function LaunchOnlinePartnersEdit(formName, productIndex, cartId, resultingPage, webSpecial , cartType) { try { var objValidator = ValidateProductToAdd( formName, productIndex ); // Need to select a valid size and color if( objValidator == null || !objValidator.isValid ) { //var errorMessage = 'Please select a size.'; HandleProductAddValidationError( productIndex ); return false; } // Selection is valid, build status string var prodName = ($('hdnDescription' + productIndex).value).replace(/&/g, "*"); prodName = prodName.replace(/®/g, "YCYC"); var strParams = "?st=" + objValidator.status + "&sku=" + objValidator.sku + "&dt=" + objValidator.availDate + "&sl=" + M_strStyleNum + "&conm=" + objValidator.color + "&d=" + prodName + "&cnm=" + objValidator.colorDesc + "&sz=" + objValidator.sizeDesc + "&m=E&md=B"; // If in stock or backordered, wire pointer if(objValidator.status == "BO" || objValidator.status == "IS") { M_pntDoHolster = function() { ModifyItemInCartMulti(formName, productIndex, cartId, location.pathname + location.search, webSpecial, cartType); } } // Launch window DoP2PWin(strParams); } catch( e ) { HandleError( "LaunchOnlinePartnersEdit", e, M_strTNPageName ); } } // Launches P2P window, querystring params get passed in function DoP2PWin(strParams) { try { var intPosLeft, intPosTop, winHeight, winWidth; winHeight = 600; winWidth = 570; intPosLeft = ((screen.width) - winWidth) / 2; if( screen.height == 600 ) { intPosTop = 0; } else { intPosTop = ((screen.height) - winHeight) / 2; } M_oPToPWin = popUpRef('/web/us' + '/popup/p2p.jsp' + strParams,'win','width=570,height=600,resizable=1,scrollbars=1,left=' + intPosLeft + ',top=' + intPosTop); } catch( e ) { HandleError( "DoP2PWin", e, M_strTNPageName ); } } /* We record the add to gearbag event for omniture*/ function CallOmnitureAddGearbag( strProductDesc, strSizeDesc, strQuantity, bIsWebSpecial, strPrice, strRefNum, strColorNum, strStyleNum ) { try { var objOmniture = new OmnitureHelper( "Add To Gearbag: " + strProductDesc ); objOmniture.updateProducts( M_strOmnCategory, strStyleNum, strProductDesc, strColorNum, strSizeDesc, strQuantity, ConvertCurrencyToNumber( strPrice ), bIsWebSpecial ); objOmniture.addToGearbag(); objOmniuture = null; } catch( e ) { HandleError( "CallOmnitureAddGearbag", e, M_strTNPageName ); } } /* User has tried to add a product to gearbag but has not selected all required data. */ function HandleProductAddValidationError( intIndex ) { try { var elSize = $("size" + intIndex); ClearProductAddValidationErrors(); if( elSize != null ) { elSize.parentNode.className = "optionRequired"; } // Show Error Box var dvError = $("dvErrorBox_" + intIndex); if( dvError != null ) { Element.setStyle(dvError, {display: 'block'}); } } catch( e ) { HandleError( "HandleProductAddValidationError", e, M_strTNPageName ); } } /* Clears out error highlighting and error messages */ function ClearProductAddValidationErrors() { try { var arrForms = document.getElementsByTagName( "form" ); // Iterate through the page forms looking for error classes for( var i=0; i < arrForms.length; i++ ) { var elSize = $("size" + i) if( elSize != null ) { elSize.parentNode.className = "productOptions"; } var arrNodes = document.getElementsByClassName( "errorBoxWrapper", arrForms[i] ); for( var j=0; j < arrNodes.length; j++ ) { arrNodes[j].style.display = "none"; } // End node loop } // End form loop } catch( e ) { HandleError( "ClearProductAddValidationErrors", e, M_strTNPageName ); } } function ModifyItemInCartMultiORIG( formName, productIndex, cartId, resultingPage, webSpecial , cartType) { try { var objValidator = ValidateProductToAdd( formName, productIndex ); var productName = $('hdnDescription' + productIndex).value; var bDoP2P = IsSectionP2P(productIndex); if( objValidator == null || !objValidator.isValid ) { //var errorMessage = 'Please select a size.'; HandleProductAddValidationError( productIndex ); return false; } if(M_bIsPToP && bDoP2P) { var prodName = productName.replace(/&/g, "*"); prodName = prodName.replace(/®/g, "YCYC"); var strParams = "?st=" + objValidator.status + "&sku=" + objValidator.sku + "&dt=" + objValidator.availDate + "&sl=" + M_strStyleNum + "&conm=" + objValidator.color + "&d=" + prodName + "&cnm=" + objValidator.colorDesc + "&sz=" + objValidator.sizeDesc + "&m=E&md=A"; // P2P is on and item is SOLD OUT or CHASE status if (objValidator.status == "OOS" || objValidator.status == "ISR") { DoP2PWin(strParams); return false; } // P2P is on and item is BACKORDERED status if (objValidator.status == "BO" && !M_bIsProdLinkWinOpen) { M_pntDoHolster = function() { ModifyItemInCartMulti(formName, productIndex, cartId, location.pathname + location.search, webSpecial, cartType); } DoP2PWin(strParams) return false; } } // end if is p2p // is not p2p else { // Sold out - NO p2p if (objValidator.status == "OOS") { var outOfStockMessage = "The size/color you've chosen is currently out of stock in our online store."; alert(outOfStockMessage); return false; } // Launch Chase - no p2p if (objValidator.status == "ISR") { popUp('/web/us/includes/retail_inventory_pop_up.jsp?productName=' + productName,'win','width=400,height=300'); return false; } } // end else is not p2p // Clear any errors ClearProductAddValidationErrors(); // add code here to check selection and complain var sku = objValidator.sku; var qty = objValidator.quantity; var price = $("price" + productIndex).value; var strMessage = BuildCartModifyMsg("modify",cartId,cartType,M_strStyleNum,sku,qty,price,webSpecial); if ( !IsEmpty(resultingPage) ) { $("iuf_hid_XML").value = strMessage; $("iuf_hid_returnJSPPage").value = resultingPage; $("itemupdateform").submit(); } else { //AddCheckoutBar(); UpdateCheckoutBar("Communicating with server..."); HideHolster(); M_objGearBagAjax.refreshObject(); M_objGearBagAjax.setIsXml(true); M_objGearBagAjax.setDestinationPath( "/web/us" ); M_objGearBagAjax.appendRequestData( "OPTION", "XML_MESSAGE_HANDLER" ); M_objGearBagAjax.appendRequestData( "XML", strMessage ); M_objGearBagAjax.appendRequestData( "convertToHTML","true"); M_objGearBagAjax.startRequest(); M_objGearBagAjax.onRequestComplete = function() { RefreshHolsterWithNewAJAX(M_objGearBagAjax); } //need to return true if we passed the validation etc. so that we can know to close the Product Focus Window return true; } } catch( e ) { HandleError( "ModifyItemInCartMulti", e, M_strTNPageName ); } } function ModifyItemInCartMulti( formName, productIndex, cartId, resultingPage, webSpecial , cartType) { try { var objValidator = ValidateProductToAdd( formName, productIndex ); var productName = $('hdnDescription' + productIndex).value; var bDoP2P = IsSectionP2P(productIndex); if( objValidator == null || !objValidator.isValid ) { //var errorMessage = 'Please select a size.'; HandleProductAddValidationError( productIndex ); return false; } if(M_bIsPToP && bDoP2P) { var prodName = productName.replace(/&/g, "*"); prodName = prodName.replace(/®/g, "YCYC"); var strParams = "?st=" + objValidator.status + "&sku=" + objValidator.sku + "&dt=" + objValidator.availDate + "&sl=" + M_strStyleNum + "&conm=" + objValidator.color + "&d=" + prodName + "&cnm=" + objValidator.colorDesc + "&sz=" + objValidator.sizeDesc + "&m=E"; // P2P is on and item is SOLD OUT or CHASE status if (objValidator.status == "OOS" || objValidator.status == "ISR") { DoP2PWin(strParams); return false; } // P2P is on and item is BACKORDERED status if (objValidator.status == "BO" && !M_bIsProdLinkWinOpen) { M_pntDoHolster = function() { ModifyItemInCartMulti(formName, productIndex, cartId, location.pathname + location.search, webSpecial, cartType); } DoP2PWin(strParams) return false; } } // end if is p2p // is not p2p else { // Sold out - NO p2p if (objValidator.status == "OOS") { var outOfStockMessage = "The size/color you've chosen is currently out of stock in our online store."; alert(outOfStockMessage); return false; } // Launch Chase - no p2p if (objValidator.status == "ISR") { popUp('/web/us/includes/retail_inventory_pop_up.jsp?productName=' + productName,'win','width=400,height=300'); return false; } } // end else is not p2p // Clear any errors ClearProductAddValidationErrors(); // add code here to check selection and complain var sku = objValidator.sku; var qty = objValidator.quantity; var price = $("price" + productIndex).value; var strMessage = BuildCartModifyMsg("modify",cartId,"CURRENT",M_strStyleNum,sku,qty,price,webSpecial); if ( !IsEmpty(resultingPage) ) { AddReloadForm(); $("iuf_hid_XML").value = strMessage; $("iuf_hid_returnJSPPage").value = resultingPage; $("itemupdateform").submit(); } else { //AddCheckoutBar(); UpdateCheckoutBar("Communicating with server..."); HideHolster(); M_objGearBagAjax.refreshObject(); M_objGearBagAjax.setIsXml(true); M_objGearBagAjax.setDestinationPath( "/web/us" ); M_objGearBagAjax.appendRequestData( "OPTION", "XML_MESSAGE_HANDLER" ); M_objGearBagAjax.appendRequestData( "XML", strMessage ); M_objGearBagAjax.appendRequestData( "convertToHTML","true"); M_objGearBagAjax.startRequest(); M_objGearBagAjax.onRequestComplete = function() { RefreshHolsterWithNewAJAX(M_objGearBagAjax); } //need to return true if we passed the validation etc. so that we can know to close the Product Focus Window return true; } } catch( e ) { HandleError( "ModifyItemInCartMulti", e, M_strTNPageName ); } } /* Checks to see that user has entered a size and a quantity */ function ValidateProductToAdd( formName, productIndex ) { var objReturn; try { objReturn = new Object(); var strSize = GetDropdownValue2( formName + productIndex, "size" + productIndex ); objReturn.quantity = GetDropdownValue2( formName + productIndex, "quantity-" + productIndex ); objReturn.isValid = ( strSize != "__NULL__" && strSize != "-1" && parseInt( objReturn.quantity ) > 0 ); if(objReturn.isValid) { objReturn.color = ( ( M_strColorNum.length > 0) ? M_strColorNum : getColorNum( $('color' + productIndex).options[$('color' + productIndex).selectedIndex].text ) ); var oColor = $("color" + productIndex); objReturn.colorDesc = oColor.options[oColor.selectedIndex].text; var arrSize = strSize.split("_"); objReturn.sku = arrSize[0]; objReturn.status = arrSize[1]; objReturn.sizeDesc = arrSize[2]; M_strStyleNum = $F("referenceID" + productIndex); var skuObj = M_arrProdSizeColor[productIndex][objReturn.color][objReturn.sizeDesc]; objReturn.availDate = skuObj.availDate; objReturn.availableDate = skuObj.availabilityInfo; } } catch( e ) { HandleError( "ValidateProductToAdd", e, M_strTNPageName ); } return objReturn; } /* Gets the value of a dropdown element. */ function GetDropdownValue2( formName, elementName ) { var strVal, objElement; // alert("formName = "+formName + " elementName = " + elementName); try { objElement = document.forms[formName].elements[elementName]; strValue = objElement.options[ objElement.selectedIndex ].value; } catch( e ) { HandleError( "GetDropdownValue2", e, M_strTNPageName ); } return strValue; } /* function to add on appropriate link information and send the user to the order 'view all' page */ function proceedToViewAll() { try { if (location.pathname.indexOf("order_summary.jsp") != (-1)) { // force return to shipping page so we hit the 400 again top.location = "http://www.patagonia.com/web/us/order/shopcart.jsp?target=" + escape("https://www.patagonia.com/web/us/order/shipping.jsp"); } else { top.location = "http://www.patagonia.com/web/us/order/shopcart.jsp?target=" + escape(location.protocol + "//www.patagonia.com" + location.pathname + location.search); } } catch ( e ) { HandleError( "proceedToViewAll", e, M_strTNPageName ); } }