var M_IN_STOCK = "IN_STOCK"; var M_IN_STOCK_RETAIL = "IN_STOCK_RETAIL"; var M_BACKORDERED = "BACKORDERED"; var M_RE_ORDERED = "RE_ORDERED"; var M_OUT_OF_STOCK = "OUT_OF_STOCK"; var M_iMouseX = 0; var M_iMouseY = 0; var M_strGFileName = "Global.js"; var M_bIsDropdownHidden = false; var M_bMenuItemShow = false; var M_bIsPFWOpen = false; var BrowserInfo = new BrowserDetect2(); var M_bIsPToP = false; var M_oPToPWin = null; // Track mouse position SetTimeout( "document.onmousemove = GetMousePosition;", 1 ); /* disallow the page to be framed */ if (window.self != window.top) { try { top.location.replace( window.location.pathname + window.location.search); } catch( e ) { HandleError( "unframe window", e, M_strGFileName ); } } /* javascript regex for illegal characters (anything not number, letter, underscore) - returns bool if it finds them*/ function HasIllegalChars( strVal ) { try { var illegalChars = /\W/; // allow only letters, numbers, and underscores return illegalChars.test(strVal); } catch( e ) { HandleError( "HasIllegalChars", e, M_strGFileName ); } } /* Changes the visibility on our pop up boxes. */ function DisplayPopUp( strLayer, bShow ) { try { Element.setStyle(strLayer, {visibility: ( bShow ? "visible" : "hidden" )}); } catch( e ) { HandleError( "DisplayPopUp", e, M_strGFileName ); } } function IsEmpty( strVal ) { try { return ( strVal == null || strVal == "" || strVal == '' || TrimWhitespace(strVal) == "" ); } catch( e ) { HandleError( "IsEmpty", e, M_strGFileName ); } } function RemoveError() { try { if( $("errorGlobal") ) { document.getElementsByTagName("div")[0].removeChild($("errorGlobal")); } } catch( e ) { HandleError( "RemoveError", e, M_strGFileName ); } } function HandleError( strFunction, err, strFile ) { try { alert( "Something is erroring: \n\nFile Name: " + strFile + "\nFunction Name: " + strFunction + "\nMessage: " + err + ", " + err.description + "\n\nRefreshing your browser window may fix things." ); } catch( e ) { alert( "Something is erroring: \n\nFile Name: " + strFile + "\nFunction Name: " + strFunction + "\nMessage: " + err + ", " + err.description + "\n\nRefreshing your browser window may fix things." ); } } /* Launches pop up window, does not return a reference */ function popUp( strURL, strWindowName, strFeatures ){ try { popUpRef( strURL, strWindowName, strFeatures ); } // End try catch( e ) { HandleError( "popUp", e, M_strGFileName ); } } /* Launches pop up window. Returns a reference */ function popUpRef( strURL, strWindowName, strFeatures ){ try { new_window = window.open( strURL, strWindowName, strFeatures ); new_window.focus(); return new_window; } // End try catch( e ) { HandleError( "popUp", e, M_strGFileName ); } } // jump to next field, used on a number of pages for the phone field. function autoNext( objStartTxtBox, objNextTxtBox ){ try { if( objStartTxtBox != null ) { if ( objStartTxtBox.value.length == objStartTxtBox.getAttribute("maxlength") ) { objNextTxtBox.focus(); } // End length check } // End if not null } // End try catch( e ) { HandleError( "autoNext", e, M_strGFileName ); } } /* Gets the coordinates of the 'off' image and positions the 'on' image, on top of it. */ function PositionPopUpBox( strImgOff, strImgOn, strDiv ) { var objCoordinates; try { objCoordinates = GetLayerAdjustmentCoordinates( strImgOff, strImgOn, strDiv ); SetObjectPosition( strDiv, objCoordinates.x, objCoordinates.y ); } catch( e ) { HandleError( "PositionPopUpBox", e, M_strPageName ); } } /* Generic method of deciding where we need to position the 'on' image. */ function GetLayerAdjustmentCoordinates( strImgOff, strImgOn, strDiv ) { var objImgOff, objImgOn, objDivLayer, objReturn; try { objImgOff = GetObjectPosition( strImgOff ); objImgOn = GetObjectPosition( strImgOn ); objDivLayer = GetObjectPosition( strDiv ); objReturn = new Object(); objReturn.x = 0; objReturn.y = 0; // Find the spread between where the off image is and where we want it to be if( objImgOff.x > objImgOn.x ) { objReturn.x = ( objDivLayer.x + ( objImgOff.x - objImgOn.x ) ); } else { objReturn.x = ( objDivLayer.x - ( objImgOn.x - objImgOff.x ) ); } if( objImgOff.y > objImgOn.y ) { objReturn.y = ( objDivLayer.y + ( objImgOff.y - objImgOn.y ) ); } else { objReturn.y = ( objDivLayer.y - ( objImgOn.y - objImgOff.y ) ); } } catch( e ) { HandleError( "GetLayerAdjustmentCoordinates", e, M_strPageName ); } return objReturn; } /* This function gets all of the dropdown menus on the page and hides them. On pages where we may have layers that need to sit on top of dropdowns, we show and hide the dropdowns before we show and hide the layer by overriding a function pointer. */ function HideDropdowns() { try { var objSelects = document.getElementsByTagName( "select" ); var nodes = $A(objSelects); nodes.each( function(node) { ShowObject( node, false );} ); M_bIsDropdownHidden = true; } catch( e ) { HandleError( "HideDropdowns", e, M_strPageName ); } } /* This function gets all of the dropdown menus on the page and shows them. On pages where we may have layers that need to sit on top of dropdowns, we show and hide the dropdowns before we show and hide the layer by overriding a function pointer. */ function ShowDropdowns() { try { var objSelects = document.getElementsByTagName( "select" ); var nodes = $A(objSelects); nodes.each( function(node) { ShowObject( node, true );} ); M_bIsDropdownHidden = false; } catch( e ) { HandleError( "ShowDropdowns", e, M_strPageName ); } } /* Adds a bookmark. Grabs the present URL/Title*/ function BookmarkPage( strProduct ) { try { var strTitle = ""; if( strProduct != null && strProduct.length > 0 ) { var strNewProduct = strProduct.replace(/\*/g,"'"); strTitle = document.title + ": " + strNewProduct; } else { strTitle = document.title; } if( window.external ) { window.external.AddFavorite( document.location.href, strTitle ); } else if( window.sidebar ) { window.sidebar.addPanel( strTitle, document.location.href, "" ); } else { alert( "Sorry. Your browser does not support this functionality." ); } } catch( e ) { HandleError( "BookmarkPage", e, M_strGFileName ); } } /* Gets the Y scroll position */ function GetScrollPositionY() { var intReturn = 0; try { if ( document.all ) { if ( !document.documentElement.scrollTop ) { intReturn = document.body.scrollTop; } else { intReturn = document.documentElement.scrollTop; } } else { intReturn = window.pageYOffset; } } catch( e ) { HandleError( "GetScrollPositionY", e, M_strGFileName ); } return intReturn; } /* Gets the X scroll position */ function GetScrollPositionX() { var intReturn = 0; try { if ( document.all ) { if ( !document.documentElement.scrollLeft ) { intReturn = document.body.scrollLeft; } else { intReturn = document.documentElement.scrollLeft; } } else { intReturn = window.pageXOffset; } } catch( e ) { HandleError( "GetScrollPositionY", e, M_strGFileName ); } return intReturn; } /* Takes a currency string and checks it for '$'. If it finds them, it removes them. */ function ConvertCurrencyToNumber( strInput ) { var strReturn; try { strReturn = strInput.toString().replace( /$|\,/g, '' ); // Its not a number, return 0 if ( isNaN( strReturn ) ) { strReturn = 0.00; } } catch( e ) { HandleError( "ConvertCurrencyToNumber", e, M_strGFileName ); } return parseFloat( strReturn ); } /* Takes a 'number' and formats it US dollar style */ function FormatCurrency( objAmount ) { var flAmount, strMinus, strAmount; try { var flAmount = parseFloat( objAmount ); if( isNaN( flAmount ) ) { flAmount = 0.00; } strMinus = ""; if( flAmount < 0 ) { strMinus = "-"; } flAmount = Math.abs( flAmount ); flAmount = parseInt( (flAmount + .005) * 100 ); flAmount = flAmount / 100; strAmount = new String( flAmount ); if( strAmount.indexOf( "." ) < 0 ) { strAmount += ".00"; } if( strAmount.indexOf( "." ) == ( strAmount.length - 2 ) ) { strAmount += "0"; } strAmount = strMinus + strAmount; } catch( e ) { HandleError( "FormatCurrency", e, M_strGFileName ); } return strAmount; } function OpenSlideshowL(id) { try { popUp('/web/us' + '/popup/media_gallery_photo_b.jsp?OPTION=SAR&assetid=' + id,'win','width=760,height=830,scrollbars=yes,resizable=yes'); } catch(e) { HandleError( "OpenSlideshowL", e, M_strGFileName ); } } /* Uses regex to trim whitespace */ function TrimWhitespace( strInput ) { var strReturn; try { if( strInput != null && strInput != ""){ strReturn = strInput.toString().replace(/^\s+/g, '').replace(/\s+$/g, ''); } else { strReturn = strInput; } } catch( e ) { HandleError( "TrimWhitespace", e, M_strGFileName ); } return strReturn; } // Function validates email in the footer function ValidateEmailSignUpFooter() { var bIsValid = false; try { var oFrm = $("emailForm"); if(oFrm != null) { var oEmail = oFrm.getElementsByTagName("input")[0]; if(oEmail != null) { bIsValid = ValidateEmail($F(oEmail)); if( !bIsValid ) { alert("Invalid email address. Must be of the form: 'name@something.xyz'"); } // end if not valid } // oemail != null } // end if ofrm != null } catch( e ) { HandleError( "ValidateSignUp", e, M_strPageName ); } return bIsValid; } // Function validates email in the footer function ValidateEmailSignUpSidebar() { var bIsValid = false; try { var oFrm = $("emailFormSide"); if(oFrm != null) { var oEmail = oFrm.getElementsByTagName("input")[0]; if(oEmail != null) { bIsValid = ValidateEmail($F(oEmail)); if( !bIsValid ) { alert("Invalid email address. Must be of the form: 'name@something.xyz'"); } // end if not valid } // oemail != null } // end if ofrm != null } catch( e ) { HandleError( "ValidateSignUp", e, M_strPageName ); } return bIsValid; } // Validates Emails function ValidateEmail( strVal ) { var bIsValid = false; try { var emailRegex = new RegExp(/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/); bIsValid = emailRegex.test(TrimWhitespace(strVal)); } catch( e ) { HandleError( "ValidateEmail", e, M_strGFileName ); } return bIsValid; } /* Positions an object. */ function SetObjectPosition( layer, intX, intY ) { try { var objLayer = GetObject( layer ); if( objLayer != null ) { strX = intX + ( intX.toString().indexOf("px") == -1 ? "px" : "" ); strY = intY + ( intY.toString().indexOf("px") == -1 ? "px" : "" ); Element.setStyle(objLayer,{top: strY, left: strX }); } } catch( e ) { HandleError( "SetObjectPosition" + e, M_strGFileName ); } } /* Helper function to return baseline x coordinate parsed as int. */ function GetBasePositionX() { var objPos; try { objBase = GetBasePosition(); } catch( e ) { HandleError( "GetBasePositionX" + e, M_strGFileName ); } return parseInt( objBase.x ); } /* Helper function to return baseline y coordinate parsed as int. */ function GetBasePositionY() { var objPos; try { objBase = GetBasePosition(); } catch( e ) { HandleError( "GetBasePositionY" + e, M_strGFileName ); } return parseInt( objBase.y ); } /* For elements that we position absolutely, this function provides us the X and Y coordinate of the item that we use as our baseline for the topmost, leftmost item. Presently its