/* * Any javascript code necessary to power the product details display window, goes here * */ var M_arrTabs = new Array( new Array ( "imgColorView", "/images/structure/en_US/product_focus_page/tabs/tab_colors_views_dn.gif", "/images/structure/en_US/product_focus_page/tabs/tab_colors_views_up.gif" ), new Array ( "imgSizes", "/images/structure/en_US/product_focus_page/tabs/tab_size_fit_dn.gif", "/images/structure/en_US/product_focus_page/tabs/tab_size_fit_up.gif" ), new Array ( "imgMoreInfo", "/images/structure/en_US/product_focus_page/tabs/tab_more_info_dn.gif", "/images/structure/en_US/product_focus_page/tabs/tab_more_info_up.gif" ), new Array ( "imgRelatedGear", "/images/structure/en_US/product_focus_page/tabs/tab_related_gear_dn.gif", "/images/structure/en_US/product_focus_page/tabs/tab_related_gear_up.gif" ) ); var M_strImagePrefix = "img_"; var M_arrColorSizes = new Array(); var sizeArray99 = new Array(); var M_arrProdSizeColor = new Array(); var M_intCurrentTabIndex = 0; var M_bIsInitialized = false; var M_objAjax; var M_strFileName = "ProductDetail.js"; var M_pntPDShowDropdowns = function(){}; var M_pntPDHideDropdowns = function(){}; var M_strStyleNum = ""; var M_strColorNum = ""; var M_strProductName = ""; var M_strOmnCategory = ""; var M_strOmnCategoryOrig = ""; var M_bIsRelatedGear = false; var M_bIsEdit = false; var M_strProductFocusPath = "/web/us/product/product_focus.jsp?OPTION=PRODUCT_FOCUS_DISPLAY_HANDLER&style_color="; var M_RELATED_QUERY = ".RELATED_GEAR:"; var M_winAltView = null; var M_strIsWebSpecial = "false"; /* When clicking any of the subtabs within the detail layer, we fire this method. It changes the style and shows the contents of the tab. */ function ChangeTabContent( objAnchor, strDivName ) { try { var aTabs = new Array( "dvTabsDescription", "dvTabsMaterial", "dvTabsAwards", "dvTabsTechnology", "dvTabsTestimonials" ); var objDvMoreInfo = $("moreInfoNav"); var arrLinks = objDvMoreInfo.getElementsByTagName( "a" ); var nodes = $A(arrLinks); Element.setStyle("productDetails", {display: (strDivName == aTabs[0] ? "block" : "none" )}); nodes.each( function(node) { node.className = ( node == objAnchor ? "linkOn" : "linkOff" ); }); aTabs.each( function(aTab) { var objDiv = $(aTab); if( objDiv != null ){ Element.setStyle(objDiv, {display: (strDivName == aTab ? "block" : "none" )}); } }); } // End try catch( e ) { HandleError( "ChangeTabContent", e, M_strFileName ); } } /* When user changes colors, we need to change the list of sizes available for that color. This method gets an array from our master array using the selected ColorCode as the key. The array we get is a collection of arrays containing size value and size display text for the dropdown. */ function ChangeSizes( strColorNumber ) { try { var ddSizes = $("ddSize"); // Wipe out all options except the default option, which presently reads 'Size' in english ddSizes.options.length = 1; var arrSizes = M_arrColorSizes[strColorNumber]; arrSizes.each(function(arrSize) { ddSizes.options[ddSizes.options.length] = new Option( arrSize[1], arrSize[0] ); }); } catch( e ) { HandleError( "ChangeSizes", e, M_strFileName ); } } function CheckForReferer() { try { if ( document.referrer != null && document.referrer.length > 0 ) { if( document.referrer.indexOf( "patagonia.com" ) <= 0 ) { M_strOmnCategory = ("REFERRER_URL:" + document.referrer ).toUpperCase(); } else { // We have no category but refer is patagonia.com - split URL and log referer var arrURL = document.referrer.split( "patagonia.com" ); M_strOmnCategory = ("PATAGONIA_REFERRER_URL:" + arrURL[1] ).toUpperCase(); } } } catch( e ) { HandleError( "CheckForReferer", e, M_strPageName ); } } /* Changes the view image*/ function UpdateView( strKeyword ) { try { switch( strKeyword ) { case "FR": Element.show("imgProductWrapperProduct"); Element.hide("dvZoom"); break; case "ZOOM": Element.show("dvZoom"); Element.hide("imgProductWrapperProduct"); break; default: break; } } catch( e ) { HandleError( "UpdateView", e, M_strFileName ); } } /* Splits up the image path and appends it with the requisite keyword. */ function CreateViewSource( strKeyword ) { try { var strDivider = ".fpx"; var strReturn = ""; var arrURL = $( "imgProductWrapperProduct" ).getAttribute( "src" ).split( strDivider ); strReturn = arrURL[0].substring(0, (arrURL[0].length-3) ) + strKeyword + strDivider + arrURL[1]; return strReturn; } catch( e ) { HandleError( "CreateViewSource", e, M_strFileName ); } } /* After product detail xml has been transformed, we iterate through the collection of available colors and skus. This function will build out the M_arrProdSizeColor to look like this example. This 3 dimentional array will then be used by other functions to change the size dropdowns & product images, & color descriptions. M_arrProdSizeColor[0]['154']['S'] = new Sku('1056401','XL','- Avail. on Feb 20, 2006'); M_arrProdSizeColor[0]['154']['M'] = new Sku('1056402','XS',''); M_arrProdSizeColor[0]['154']['L'] = new Sku('1056398','XXL','- Sold Out'); M_arrProdSizeColor[0]['154']['XL'] = new Sku('1056401','XL','- Avail. on Feb 20, 2006'); */ function BuildColorSizeArrays( xHelp ) { try { var oColors = xHelp.getElementSet( "Color" ); var oSkus = xHelp.getElementSet( "Sku" ); var strColorNum; var intProductFocusWindowArrayIndex = 99; // the following javascript is used to make the arrays needed to dynamically change the color & size drop downs. M_arrProdSizeColor[intProductFocusWindowArrayIndex] = new Array(); var oNumber2 = oColors[0].getElementsByTagName( "Number" )[0]; var strOneColorNum = xHelp.getElementValue( oNumber2 ); sizeArray99 = BuildAllSizesArray( xHelp, strOneColorNum, oSkus ); for( var i=0; i < oColors.length; i++ ) { var oNumber = oColors[i].getElementsByTagName( "Number" )[0]; strColorNum = xHelp.getElementValue( oNumber ); M_arrProdSizeColor[intProductFocusWindowArrayIndex][strColorNum] = new Array(); var oXml; for( var j=0; j < oSkus.length; j++ ) { oXml = new XmlHelper(oSkus[j]); // Check if this sku set matches our color if( oXml.getElementValue( "ColorNumber" ) == strColorNum ) { M_arrProdSizeColor[intProductFocusWindowArrayIndex][strColorNum][oXml.getElementValue( "Size" )] = BuildSkuObject( oXml ); } // end if } // end for } // end for } catch( e ) { HandleError( "BuildColorSizeArrays", e, M_strFileName ); } } /* this function will build a Sku object that looks something like this. = new Sku('1056401','XL','- Avail. on Feb 20, 2006'); */ function BuildSkuObject( oXml ) { try { var sku = new Sku(); var strStockStatus; sku.skuRefId = oXml.getElementValue( "ReferenceId" ); sku.size = oXml.getElementValue( "Size" ); sku.availDate = oXml.getElementValue( "InventoryDateYear" ); var strShortDate = oXml.getElementValue( "InventoryDate" ); strStockStatus = oXml.getElementValue( "InventoryStatus" ) switch( strStockStatus ) { case M_OUT_OF_STOCK: sku.availabilityInfo = '- Sold Out'; sku.status = "OOS"; break; case M_IN_STOCK_RETAIL: sku.availabilityInfo = ''; sku.status = "ISR"; break; case M_BACKORDERED: sku.availabilityInfo = '-Avail. ' + strShortDate + ''; sku.status = "BO"; break; case M_RE_ORDERED: sku.availabilityInfo = '- Re Ordered ' + strShortDate + ''; sku.status = "RO"; break; default: sku.availabilityInfo = ''; sku.status = "IS"; break; } return sku; } catch( e ) { HandleError( "BuildSkuObject", e, M_strFileName ); } } /*this function builds an array that looks like this: var sizeArray99 = new Array('XS', 'S', 'M', 'L', 'XL', 'XXL');*/ function BuildAllSizesArray( xHelp, strOneColorNum, oSkus ) { var sizeArray = new Array(); var oXml; try { var nodes = $A(oSkus); nodes.each(function(node) { oXml = new XmlHelper(node); // Check if this sku set matches our color if( oXml.getElementValue( "ColorNumber" ) == strOneColorNum ) { sizeArray[parseInt(oXml.getElementValue( "SizeDisplaySeq" ))] = oXml.getElementValue( "Size" ); } }); return sizeArray; } catch( e ) { HandleError( "BuildAllSizesArray", e, M_strFileName ); } } /* Closes the product detail window via toggle. */ function CloseDetail() { try { M_bIsPFWOpen = false; M_intCurrentTabIndex = 0; myOpacity.toggle(); CloseProdPopUps(); // If necessary, show dropdowns M_pntPDShowDropdowns(); } catch( e ) { HandleError( "CloseDetail", e, M_strFileName ); } } /* Closes the product detail window via - hide*/ function HideDetail() { try { M_bIsPFWOpen = false; M_intCurrentTabIndex = 0; myOpacity.hide(); CloseProdPopUps(); // If necessary, show dropdowns M_pntShowDropdowns(); } catch( e ) { HandleError( "HideDetail", e, M_strFileName ); } } /* Puts div containing progress bar in ceter of browser */ function PositionProgressBarCenter() { try { var objSize = GetBrowserSize(); var intPosLeft = (parseInt(objSize.x) /2) + parseInt(GetScrollPositionX()) - 60; var intPosTop = (parseInt(objSize.y) /2) + parseInt(GetScrollPositionY()) - 33; var dvPending = $("loadingMsg2"); Element.setStyle(dvPending,{top: intPosTop + "px", left: intPosLeft + "px", display: 'block' }); } catch( e ) { HandleError( "PositionProgressBarCenter", e, M_strFileName ); } } /* This function crunches some numbers and positions progress bar on top of product image. It is dependent on the size of the product images being specified in the page load of a given page. */ function PositionProgressBarOnProduct( objProdImg ) { try { var intProcessImgHeight = 15; var intProcessImgWidth = 96; var dvPending = $("loadingMsg2"); var intImgHeight = ( isNaN(objProdImg.getAttribute( "height" )) ? 0 : objProdImg.getAttribute( "height" ) ); var intImgWidth = ( isNaN(objProdImg.getAttribute( "width" )) ? 0 : objProdImg.getAttribute( "width" ) ); var objPos = GetObjectPosition( objProdImg ); var intYFactor = ( ( (parseInt(intImgHeight) - parseInt(intProcessImgHeight)) * .3 ) + parseInt(objPos.y) ); var intXFactor = ( ( (parseInt(intImgWidth) - parseInt(intProcessImgWidth)) / 2 ) + parseInt(objPos.x) ); dvPending.style.top = intYFactor + "px"; dvPending.style.left = intXFactor + "px"; Element.setStyle(dvPending,{top: intYFactor, left: intXFactor, display: 'block' }); } catch( e ) { HandleError( "PositionProgressBarOnProduct", e, M_strFileName ); } } /* Function called by contribution pages to embed PFW links in the contributions. */ function ShowDetailAnchor( strStyleNum, strColorNum ) { try { var strLoc = window.location.href; if( strLoc.indexOf("#") != -1 ) { strLoc = strLoc.split("#")[0]; } window.location = strLoc + "#sku." + strStyleNum; ShowDetail( strStyleNum, strColorNum ); } catch( e ) { HandleError( "ShowDetailAnchor", e, M_strFileName ); } } function AdjustRelatedItemsCategory( strCategory ) { try { if( strCategory != null && strCategory.length > 0 && strCategory.indexOf( M_RELATED_QUERY ) >= 1 ) { var arrCat = strCategory.split( M_RELATED_QUERY ); return arrCat[0]; } else { return strCategory; } } catch( e ) { HandleError( "AdjustRelatedItemsCategory", e, M_strPageName ); } } function ShowRelatedDetail( strStyleNum, strProductName ) { try { var strNewCategory = AdjustRelatedItemsCategory( M_strOmnCategory ); M_strOmnCategory = strNewCategory + M_RELATED_QUERY + escape(M_strProductName); M_bIsRelatedGear = true; ShowDetail( strStyleNum ); } catch( e ) { HandleError( "ShowRelatedDetail", e, M_strFileName ); } } /* Kicks off AJAX call to get product information and builds product detail layer, with passed color, size, qty and cart id parameterst to trigger an edit of a cart item, rather than the function to add another item to the cart */ function ShowDetail( strStyle, color, skuRefId, quantity, cartId, intTab, resultingPage, webSpecial , cartType, isIdCombo ) { // route directly to page ShowProductFocusPage( strStyle, color, skuRefId, quantity, cartId, intTab, resultingPage, webSpecial ); return; if (!BrowserInfo.showPFW()) { ShowProductFocusPage( strStyle, color, skuRefId, quantity, cartId, intTab, resultingPage, webSpecial ); } else { if( !IsEmpty(webSpecial) ) M_strIsWebSpecial = webSpecial.toString(); //alert("ShowDetailForEdit : strStyle = " + strStyle + " color = " + color + " skuRefId = " + skuRefId + " quantity = " + quantity + " cartId = " + cartId + " intTab = " + intTab); var strStyle, imgID, objL; /* Omniture: If user's start clicking RelatedGear products, we begin manipulating the category to reflect this. However, if they break the RelatedGear flow by 'closing' the pfw, we need to reset the category to its original value*/ if( !M_bIsRelatedGear ) { M_strOmnCategory = M_strOmnCategoryOrig; } else { M_bIsRelatedGear = false; } // We always start out as though we are in 'add' mode M_bIsEdit = false; try { if( !M_bIsInitialized ) { return; } HideAllHolsters(); // Decide where to put the details layer and flush contents PositionDetailsLayer(); Element.update("dvDetailLayer", ""); if( $( "loadingMsg2" ).style.display == "block" ) { CloseMessagingWindow(); } var objProdImg = (!IsEmpty(isIdCombo) && isIdCombo ) ? $( M_strImagePrefix + strStyle + "_" + color ) : $( M_strImagePrefix + strStyle ); if( objProdImg != null ) { PositionProgressBarOnProduct( objProdImg ); } else { PositionProgressBarCenter(); } // See if the window is currently open, if so, close it if( M_bIsPFWOpen ) { HideDetail(); } M_objAjax.refreshObject(); M_objAjax.setIsXml(true); M_objAjax.styleNumber = strStyle; //M_objAjax.setDestinationPath( "http://patagonia.zaneray.com/za/PDC" ); //M_objAjax.setDestinationPath( "Sample1.xml" ); M_objAjax.setDestinationPath( "/web/us" ); M_objAjax.appendRequestData( "OPTION", "XML_PRODUCT_DATA" ); if ( !IsEmpty(color) ) { M_objAjax.appendRequestData( "style_color", strStyle + '-' + color ); } else { M_objAjax.appendRequestData( "style_color", strStyle ); } if ( !IsEmpty(skuRefId) ) { M_objAjax.appendRequestData( "skuRefId", skuRefId ); } if ( !IsEmpty(quantity) ) { M_objAjax.appendRequestData( "quantity", quantity ); } if ( !IsEmpty(cartId) ) { M_objAjax.appendRequestData( "cartId", cartId ); // If we have a cart id, this is an edit M_bIsEdit = true; } if ( !IsEmpty(resultingPage) ) { M_objAjax.appendRequestData( "resultingPage", resultingPage ); } if ( !IsEmpty(webSpecial) ) { M_objAjax.appendRequestData( "ws", webSpecial ); } if ( !IsEmpty(cartType) ) { M_objAjax.appendRequestData( "cartType", cartType ); } if(M_bIsPToP) { M_objAjax.appendRequestData("prodLinks", "true" ); } M_objAjax.startRequest(); M_objAjax.onRequestComplete = function() { if ( !IsEmpty(intTab) && intTab > -1) { PopulateDetailsXSLT( 0, intTab, color ); } else { PopulateDetailsXSLT( 0, null, color ); } } } // End try catch( e ) { HandleError( "ShowDetail", e, M_strFileName ); } } } /* The ShowProductFocusPage() function is called from the ShowDetail function, when the showPFW request attribute is set to false. This happens in the case of the Safari Browser. The ShowProductFocusPage() function redirects the browser to the Product Focus Page. */ function ShowProductFocusPage( strStyle, color, skuRefId, quantity, cartId, intTab, resultingPage, webSpecial ) { try { var pfpURL = 'http://' + 'www.patagonia.com' + '/web/us'; pfpURL = pfpURL + '/product/product_focus.jsp?OPTION=PRODUCT_FOCUS_DISPLAY_HANDLER&style_color=' + strStyle; if ( !IsEmpty(color) ) { pfpURL += '-' + color; } if ( !IsEmpty(skuRefId) ) { pfpURL += '&skuRefId=' + skuRefId; } if ( !IsEmpty(quantity) ) { pfpURL += '&quantity=' + quantity; } if ( !IsEmpty(cartId) ) { pfpURL += '&cartId=' + cartId; } if ( !IsEmpty(resultingPage) ) { pfpURL += '&resultingPage=' + resultingPage; } if ( !IsEmpty(webSpecial) ) { pfpURL += '&ws=' + webSpecial; } if ( !IsEmpty(intTab) && intTab > -1) { pfpURL += '&intTab=' + intTab; } if ( M_strOmnCategory != null && M_strOmnCategory.length > 0 ) { pfpURL += '&patcatcode=' + M_strOmnCategory; } self.location = pfpURL; } // End try catch( e ) { HandleError( "ShowProductFocusPage", e, M_strFileName ); } } /* Closes error message window */ function CloseMessagingWindow() { try { Element.setStyle("loadingMsg2", {padding: '0px', display: 'none'}); Element.show("imgProductLoading"); Element.hide("dvMessagingError"); Element.hide("dvXsltError"); M_pntPDShowDropdowns(); } catch( e ) { HandleError( "CloseMessagingWindow", e, M_strFileName ); } } /* Displays error message when problem loading xslt */ function DisplayXsltErrorMessage( strStyleNumber ) { try { var strProductFocusPath = M_strProductFocusPath + strStyleNumber; $("aProdFocusPageXslt").setAttribute( "href", strProductFocusPath ); $("imgProductLoading").style.display = "none"; $("dvXsltError").style.display = "block"; } catch( e ) { HandleError( "DisplayXsltErrorMessage", e, M_strFileName ); } } /* Displays error message when problem connecting with server */ function DisplayServerErrorMessage( strStyleNumber ) { try { var strProductFocusPath = M_strProductFocusPath + strStyleNumber; $( "aProdFocusPageServer" ).setAttribute( "href", strProductFocusPath ); $("imgProductLoading").style.display = "none"; $("dvMessagingError").style.display = "block"; } catch( e ) { HandleError( "DisplayServerErrorMessage", e, M_strFileName ); } } /* Here is where we transform the xml. We try to 'wait' until out xslt file is loaded */ function PopulateDetailsXSLT( intNumberOfTries, intSelectedTabIndex, strColor ) { var objResults, objDiv; try { objDiv = $("dvDetailLayer"); // Is the xslt file loaded? if( !M_objAjax.getIsXslLoaded() ) { // xsl is not loaded yet, wait a few seconds and try again - for total of 10 seconds (5x) if( intNumberOfTries < 5 ) { var tries = intNumberOfTries + 1 SetTimeout( "PopulateDetailsXSLT(" + tries + ");", 2 ); } else { // Die gracefully - do nothing DisplayXsltErrorMessage( M_objAjax.styleNumber ); return; } } else { // Are we running P2P? If so, add a flag to our xml var xHelp = new XmlHelper( M_objAjax.getResponseXml() ); // XSLT is loaded - do yo' thang objResults = M_objAjax.transformResponseXml(); Element.update(objDiv, ""); if( objResults != null ) { //for use when debugging the product focus window if( typeof objResults == "object" ) { objDiv.appendChild(objResults); // As a workaround for FF, we need to un-escape some characters GoDecoding(); } else { Element.update(objDiv, objResults); } // Before we display our results - make sure it has been transformed by checking for a node in our xslt var spStyleNum = $("spStyleNumber"); if( spStyleNum == null || spStyleNum.innerHTML.length == 0 ) { Element.update(objDiv, ""); DisplayXsltErrorMessage( M_objAjax.styleNumber ); return; } Element.hide("loadingMsg2"); if( intSelectedTabIndex > 0 ) { PreselectPopupTab( intSelectedTabIndex ); } myOpacity.toggle(); // If necessary, hide dropdowns M_pntPDHideDropdowns(); M_bIsPFWOpen = true; } // End if objResults != null else { DisplayServerErrorMessage( M_objAjax.styleNumber ); return; } // Set these for zoom M_strStyleNum = xHelp.getElementValue( "ReferenceId" ); M_strIsWebSpecial = xHelp.getElementValue( "WebSpecial" ); if( !IsEmpty(strColor) ) { M_strColorNum = strColor; } else if( M_strIsWebSpecial == "true" ) { M_strColorNum = xHelp.getElementValue( "FeatureColorWs" ); } else { M_strColorNum = xHelp.getElementValue( "FeatureColor" ); } M_strProductName = xHelp.getElementValue( "Name" ); // Some products do not have a Feature Color - for those, grab the first item. if( M_strColorNum.length == 0 ) { M_strColorNum = getColorNum( $F("color99") ); } BuildColorSizeArrays( xHelp ); CallOmnitureViewProduct( xHelp ); } } catch( e ) { HandleError( "PopulateDetailsXSLT", e, M_strFileName ); } } /* This function is used to preselect a particular tab in the popup layer - 0 based!!*/ function PreselectPopupTab( intIndex ) { try { switch( intIndex ) { case 1: SetTabFocus( "productFitWrapper", 1 ); break; case 2: SetTabFocus( "moreInfoWrapper", 2 ); break; case 3: SetTabFocus( "productInfoC", 3 ); break; default: break; } } catch( e ) { HandleError( "PreselectPopupTab", e, M_strFileName ); } } function PositionDetailsLayer() { try { var objDetailsDiv = $( "dvDetailLayer" ); // Decide where to put the details layer var objBasePos = GetBasePosition(); var intYPos = GetScrollPositionY(); SetObjectPosition( objDetailsDiv, objBasePos.x, ( intYPos + 25 ) ); } catch( e ) { HandleError( "PositionDetailsLayer", e, M_strFileName ); } } /* Gets the data we need out of the xml and calls Omniture to record a product view event.*/ function CallOmnitureViewProduct( xHelp ) { try { // Only record ProductView event when we are in 'Add' mode if( M_bIsEdit ) return; var strName = xHelp.getElementValue( "Name" ).replace( ";", "" ); var strFeatureColor = xHelp.getElementValue( "FeatureColor" ); var strPrice = ""; var bIsWebSpecial = false; var strReferenceId = ""; // Price if ( xHelp.getElementValue( "SpecialPriceValue" ) == null || xHelp.getElementValue( "SpecialPriceValue" ) == "" ) { strPrice = xHelp.getElementValue( "RegularPriceValue" ); } else { strPrice = xHelp.getElementValue( "SpecialPriceValue" ); } // Web Special if ( xHelp.getElementValue( "WebSpecial" ) != null && xHelp.getElementValue( "WebSpecial" ).length > 0 ) { bIsWebSpecial = xHelp.getElementValue( "WebSpecial" ); } // Make omniture call - Signature: ( strColorName, strColorCode, strSize, strReferenceNum, bIsWebSpecial ) var objOmniture = new OmnitureHelper( "View Product Detail: " + strName ); objOmniture.updateProducts( M_strOmnCategory, M_strStyleNum, strName, strFeatureColor, "", "", ConvertCurrencyToNumber( strPrice ), bIsWebSpecial ); objOmniture.viewProduct(); objOmniture = null; } catch( e ) { HandleError( "CallOmnitureViewProduct", e, M_strFileName ); } } /* Iterates through sku nodes looking for a match on size and color. */ function FindSelectedProductNodes( xHelp, strSize, strColorNumber ) { var objSkuNodes, objColorNode, objSizeNode, objReturnNodes; try { // Get the skus objSkuNodes = xHelp.getElementSet( "Sku" ); // Iterate through looking for our size and color number for( var i=0; i < objSkuNodes.length; i++) { objColorNode = objSkuNodes[i].getElementsByTagName( "ColorNumber" ); // See if color number matches if( objColorNode != null && objColorNode[0].firstChild.nodeValue == strColorNumber ) { objSizeNode = objSkuNodes[i].getElementsByTagName( "Size" ); // Look for a size match if( objSizeNode != null && objSizeNode[0].firstChild.nodeValue == strSize ) { // We have a match, so set a reference to the node and return objReturnNodes = objSkuNodes[i]; break; } // End if size node matches } // End if color number matches } // End for loop } // End try catch( e ) { HandleError( "FindSelectedProductNodes", e, M_strFileName ); } return objReturnNodes; } function ToggleDetailsLayer() { try { myOpacity.toggle(); } catch( e ) { HandleError( "ToggleDetailsLayer", e, M_strFileName ); } } /* Function gets called when user clicks a tab. If its a new tab, we swap images. */ function SetTabFocus( strDivTabId, intTabIndex ) { try { // tab might be suspended if( $(M_arrTabs[intTabIndex][0]) == null){ return;} var objDisplayWindow, objOldDisplay, objNewDisplay, objFreeParking; objDisplayWindow = $( "dvRing" ); objOldDisplay = objDisplayWindow.getElementsByTagName( "div" ).item(0); // If we're clicking on the node we're currently on, leave. if( strDivTabId == objOldDisplay.getAttribute( "id" ) ) { return; } Element.setStyle(objOldDisplay, {display: 'none'}); AdjustTabFocus( intTabIndex ); // Take the tab we want to display out of the parking lot and into the showroom objNewDisplay = $( strDivTabId ); objFreeParking = objNewDisplay.parentNode; // Take old tab out of showroom and into the parking lot objFreeParking.appendChild( objOldDisplay ); objDisplayWindow.appendChild( objNewDisplay ); Element.setStyle(objNewDisplay, {display: 'block'}); } catch( e ) { HandleError( "SetTabFocus", e, M_strFileName ); } } /* Makes function call to change src attribute on all affected images */ function UpdateProductImageColor( strColorNum ) { try { // We need this for our zoom M_strColorNum = strColorNum; UpdateImageSourceAttribute( "imgProductWrapperProduct", strColorNum ); UpdateImageSourceAttribute( "imgMoreInfoWrapperProduct", strColorNum ); UpdateImageSourceAttribute( "imgProductInfoProduct", strColorNum ); UpdateImageSourceAttribute( "imgProductFitProduct", strColorNum ); // Zoom is showing, update him if( Element.getStyle("dvZoom","display") == "block" ) { ShowZoom(); } } catch( e ) { HandleError( "UpdateProductImageColor", e, M_strFileName ); } } /* Using regex, we take an images source value and replace the color code portion of it. */ function UpdateImageSourceAttribute( strImg, strColorNum ) { var strSource, arrSource, strDelim, strFixedPath, objImg; try { strDelim = ".fpx"; objImg = $( strImg ); if( objImg != null ) { strSource = objImg.getAttribute( "src" ); arrSource = strSource.split( strDelim ); strFixedPath = arrSource[0].replace( /([0-9]{3}$)/, strColorNum ); objImg.setAttribute( "src", strFixedPath + strDelim + arrSource[1] ); } } catch( e ) { HandleError( "UpdateImageSourceAttribute", e, M_strFileName ); } } function AdjustTabFocus( intTabIndex ) { try { // Turn on the new tab $( M_arrTabs[intTabIndex][0] ).setAttribute( "src", M_arrTabs[intTabIndex][1] ); // Turn off the old tab $( M_arrTabs[M_intCurrentTabIndex][0] ).setAttribute( "src", M_arrTabs[M_intCurrentTabIndex][2] ); // Reset who is on M_intCurrentTabIndex = intTabIndex; } catch( e ) { HandleError( "AdjustTabFocus", e, M_strFileName ); } } /* Instantiates our opacity object and loads xslt*/ function InitializeProductDetailLayer() { try { if( $("dvDetailLayer") != null ) { myOpacity = new fx.Opacity( "dvDetailLayer", {duration: 400}); myOpacity.hide(); } try { M_objAjax = new AjaxWrapper(); M_objAjax.loadXslt( "/web/us/xsl/ProductDetail.xsl" ); } catch( ex ) { BrowserInfo.setOverridePFW(true); BrowserInfo.setShowPFWOverride(false); } M_bIsInitialized = true; /* if (BrowserInfo.showPFW()) { CheckForOnLoadLaunch(); }*/ } catch( e ) { HandleError( "InitializeProductDetailLayer", e, M_strFileName ); } } /* When loading a page, we check the url for a sku. If its there, we 'pre-load' a product focus window. */ function CheckForOnLoadLaunch() { var strWs; try { // Check for sku in the URL if( document.location.href.indexOf( "#sku." ) > 1 ) { arrURL = document.location.href.split( "#sku." ); // See if we have a URL to try to load if( arrURL[1].length == 5 ) { // Look for webspecial parameter strWs = GetQuerystringParam("ws"); ShowDetail(arrURL[1], "", "", "", "", "", "", strWs); } // End if length == 5 } // End if has sku } // End try catch( e ) { HandleError( "CheckForOnLoadLaunch", e, M_strFileName ); } } /* http://www.4guysfromrolla.com/webtech/100505-1.shtml Big Up to Sean Burke & 4Guys. This method unescapes text that gets mangled by the xml parser. It lets us insert pre-rendered HTML in to our xml. */ function GoDecoding() { try { var to_decode = document.getElementsByName( "decodeable" ); var s; for(var i = to_decode.length - 1; i >= 0; i--) { s = to_decode[i].textContent; if( s == undefined || (s.indexOf('&') == -1 && s.indexOf('<') == -1) ) { // the null or markupless element needs no reworking } else { to_decode[i].innerHTML = s; // that's the magic } } } catch( e ) { HandleError( "GoDecoding", e, M_strFileName ); } return; } /* Launches the flash zoom for our focus window */ function ShowZoom() { try { var strContents = ""; var dvZoom = $("dvZoom"); // Flush current contents Element.update(dvZoom, ""); var so = new SWFObject("http://www.patagonia.com/tsimages?TSimg=/tszoom/flash/zoommx.swf&svr=www.patagonia.com&img=tsimages/" + M_strStyleNum + "_" + M_strColorNum + ".fpx&w=500&h=500&bgc=FFFFFF&rgn=0.21,0.104,0.579,0.583&mz=2,2&ui=1&nv=1", "ZoomMX", "500", "500", "6", "#ffffff"); so.addParam("menu", "false"); so.addParam("scale", "noscale"); so.addParam("salign", "LT"); so.addParam("align", ""); so.write("dvZoom"); UpdateView( "ZOOM" ); } catch( e ) { HandleError( "ShowZoom", e, M_strFileName ); } } /* Launches the alt view window and sets reference */ function OpenAltView() { try { var strDomain = "http://" + "www.patagonia.com" + "/web/us"; var strURL = strDomain + "/popup/alternate_views.jsp?OPTION=PRODUCT_ALT_VIEW_DISPLAY_HANDLER&style_color=" + M_strStyleNum + "&ws=" + M_strIsWebSpecial.toString(); M_winAltView = popUpRef(strURL, "alt_view", "width=600,height=600,scrollbars=no,menubar=no,statusbar=no"); } catch( e ) { HandleError( "OpenAltView", e, M_strFileName ); } } /* Close alt view when page unloads */ function CloseProdPopUps() { try { // Alt View if( M_winAltView != null ) { M_winAltView.close(); M_winAltView = null; } // P2P Window if( M_oPToPWin != null ) { M_oPToPWin.onunload = function(){} M_oPToPWin.close(); M_oPToPWin = null; } } catch( e ) { HandleError( "CloseProdPopUps", e, M_strFileName ); } } // ################################# start section for product focus page ########################################### function Sku(skurefid, size, availabilityinfo, status, availdate) { this.skuRefId = skurefid; this.size = size; this.availabilityInfo = availabilityinfo; this.status = status; this.availDate = availdate; this.getSizeVal = function() { return this.skuRefId + "_" + this.status + "_" + this.size; } } function getColorNum(color) { try { var colorNum = color; var colSt = color.lastIndexOf("(") + 1; var colEnd = color.lastIndexOf(")"); if (colSt >= 0 && colEnd >=0) colorNum = color.substring(colSt,colEnd); return colorNum; } catch( e ) { HandleError( "getColorNum", e, M_strFileName ); } } function updateColorAndSizes(color, productID, formName, availIndex, sizeArray) { // alert("updateColorAndSizes(" + color + ", " + productID + ", " + formName + ", " + availIndex + ')'); try { var colorNum = getColorNum(color); var colorName = "color" + availIndex; var sizeName = "size" + availIndex; // var img = "prodImg" + availIndex; //changes the product image // document.images[img].src = fpxImageURL + "/" + productID + "_" + colorNum + ".fpx?wid=" + imageSize + fpxAttributes; UpdateProductImageColor(colorNum); if (document.forms[formName]) { var elmt = document.forms[formName].elements[colorName]; if (elmt.options[elmt.selectedIndex].value.indexOf(colorNum) == -1) { for (var i = 0; i < elmt.options.length; i++) { if (elmt.options[i].value.indexOf(colorNum) != -1) { elmt.selectedIndex = i; break; } } } } var colorDescription = elmt.options[elmt.selectedIndex].value; ChangeColorLabels2(colorDescription); updateSizeDropDown(colorNum, formName, sizeName, availIndex, sizeArray); UpdateView( "FR" ); } catch( e ) { HandleError( "updateColorAndSizes", e, M_strFileName ); } } // Certain categories of products don't get p2p, no matter where they appear. function IsSectionP2P(strIndex) { var bDoP2P = true; try { var oIsP2P = $("isp2p_" + strIndex); if(oIsP2P != null) { if($F("isp2p_" + strIndex) == "false") { bDoP2P = false; } } } catch( e ) { HandleError( "IsSectionP2P", e, M_strFileName ); } return bDoP2P; } /*this function will update the size dropdown to match the size & inventory info with the selected color */ function updateSizeDropDown(colorNum, formName, sizeName, availIndex, sizeArray) { // alert("updateSizeDropDown(" + colorNum + ", " + formName + ", " + sizeName + ", " + availIndex + "," + sizeArray); try { var sizeDropDown = document.forms[formName].elements[sizeName]; var iLength = sizeDropDown.length; var prodArrOk = false; var skuObj; var bDoP2P = IsSectionP2P(availIndex); if (M_arrProdSizeColor[availIndex] != null && M_arrProdSizeColor[availIndex][colorNum] != null) prodArrOk = true; if(M_bIsPToP && bDoP2P) { //Have to start from 0 because for single size items the length is 1 for (var i = 0; i < iLength; i++) { skuObj = M_arrProdSizeColor[availIndex][colorNum][sizeArray[i-1]]; if (prodArrOk && skuObj != null) { sizeDropDown.options[i] = new Option(skuObj.size, skuObj.getSizeVal()); } } // end for } // end if else { // No P2P display for (var i = 0; i < iLength; i++) { skuObj = M_arrProdSizeColor[availIndex][colorNum][sizeArray[i-1]]; if (prodArrOk && skuObj != null) { sizeDropDown.options[i] = new Option(skuObj.size + skuObj.availabilityInfo, skuObj.getSizeVal()); } } // end for } // end else } catch( e ) { HandleError( "updateSizeDropDown", e, M_strFileName ); } } /* Resets color labels in all of the color tabs. Fires when user changes colors. */ function ChangeColorLabels2( colorDescription) { try { Element.update("productName", colorDescription); Element.update("moreInfoColor", colorDescription); Element.update("productInfoColor", colorDescription); Element.update("dvProductFitName", colorDescription); } catch( e ) { HandleError( "ChangeColorLabels2", e, M_strFileName ); } } // ################################# end section for product focus page ########################################### function writeConsole(content,wincode, winname) { top.consoleRef=window.open('',wincode, 'width=600,height=400' +',menubar=0' +',toolbar=1' +',status=0' +',scrollbars=1' +',resizable=1') // top.consoleRef.document.open("text/html","replace"); top.consoleRef.document.writeln( '' + winname + 'Console' +'' +content +'' ) top.consoleRef.document.close() }