function OnSizeMouseOver(e, mainTable, disabledClassName, selectedClassName, hoverClassName, sizeStructureID, oldClassFieldID, callOutStructureID, showCallOuts, divCallOutPointerID, divCallOutMessageID, handlingMessageLabelID, alternateHandlingMessage, currentHandlingMessageFieldID, originalHandlingMessageFieldID) {

    var sizeStructure = document.getElementById(sizeStructureID);

    var activePageWidth = sizeListActivePageWidth; // Usable page width in pixels
    var isLeftJustified = sizeListIsLeftJustified; // Indicates whether the site is left justified.

    if (sizeStructure && sizeStructure.className != disabledClassName && sizeStructure.className != selectedClassName) {
        var oldClassField = document.getElementById(oldClassFieldID);

        if (oldClassField) {
            oldClassField.value = sizeStructure.className;
            sizeStructure.className = hoverClassName;
        }
    }

    var callOutStructure = document.getElementById(callOutStructureID);

    if (callOutStructure && showCallOuts == "true") {
        // In IE, the callOutStructure, a tr, will reserve 1px for itself when visible.
        // It will not in FireFox, so there is no need to adjust the margin
        if (navigator.appVersion.indexOf("MSIE") > -1) {
            mainTable.style.marginTop = "0px";
        }

        callOutStructure.style.visibility = "visible";
        callOutStructure.style.display = "";

        var divCallOutPointer = document.getElementById(divCallOutPointerID);
        var divCallOutMessage = document.getElementById(divCallOutMessageID);

        if (divCallOutPointer && divCallOutMessage) {

            // Move the top of the call out message box up based on the message height, plus 11 px for the pointer.
            divCallOutMessage.style.marginTop = (-1 * (11 + divCallOutMessage.offsetHeight)) + "px";

            // Make sure that the edge of the callout message box doesn't leave the product size list box.
            if (isLeftJustified) {
                // If the site is left justified, then the calculation is a little different -- simpler.
                if ((divCallOutMessage.offsetLeft + divCallOutMessage.offsetWidth + 12) > activePageWidth) {
                    divCallOutMessage.style.marginLeft = (-1 * ((divCallOutMessage.offsetLeft + divCallOutMessage.offsetWidth + 12) - activePageWidth)) + "px";
                }
            }
            else {
                // This site isn't left justified, so we do have to take the center of the page into account in our calculations.
                var windowWidth = (window.innerWidth) ? window.innerWidth : document.body.clientWidth;
                if ((divCallOutMessage.offsetLeft + divCallOutMessage.offsetWidth + 12) > (((windowWidth - activePageWidth) / 2) + activePageWidth)) {

                    // This if a Firefox fix. It seems that FF caches the position of the box between hides and shows.  Therefore, if the
                    // position of the box is less than 1, then we can assume that the box has already been moved, and it shouldn't 
                    // be moved again. 
                    if (((divCallOutMessage.offsetLeft + divCallOutMessage.offsetWidth + 12) - (((windowWidth - activePageWidth) / 2) + activePageWidth)) > 1) {
                        divCallOutMessage.style.marginLeft = (-1 * ((divCallOutMessage.offsetLeft + divCallOutMessage.offsetWidth + 12) - (((windowWidth - activePageWidth) / 2) + activePageWidth))) + "px";
                    }
                }
            }

        }
    }

    var handlingMessageLabel = document.getElementById(handlingMessageLabelID);

    if (handlingMessageLabel) {
        var originalHandlingMessageField = document.getElementById(originalHandlingMessageFieldID);
        var currentHandlingMessageField = document.getElementById(currentHandlingMessageFieldID);

        //This capture the original and current handling messages on the first mouseover
        if (originalHandlingMessageField && originalHandlingMessageField.value.length == 0 && currentHandlingMessageField && currentHandlingMessageField.value.length == 0) {
            originalHandlingMessageField.value = handlingMessageLabel.innerHTML;
            currentHandlingMessageField.value = handlingMessageLabel.innerHTML;
        }

        if (alternateHandlingMessage && alternateHandlingMessage.length > 0) {
            handlingMessageLabel.innerHTML = alternateHandlingMessage;
        }
        else {
            handlingMessageLabel.innerHTML = originalHandlingMessageField.value;
        }
    }
}

function OnSizeMouseOut(e, mainTable, selectedClassName, sizeStructureID, oldClassFieldID, callOutStructureID, handlingMessageLabelID, currentHandlingMessageFieldID) {
    var element = e.relatedTarget || e.toElement;

    var sizeStructure = document.getElementById(sizeStructureID);

    if (IsChildOf(element, sizeStructure)) {
        return;
    }

    var oldClassField = document.getElementById(oldClassFieldID);

    if (sizeStructure && oldClassField) {
        if (sizeStructure.className != selectedClassName) {
            sizeStructure.className = oldClassField.value;
        }
    }

    var callOutStructure = document.getElementById(callOutStructureID);

    if (callOutStructure) {
        // In IE, the callOutStructure, a tr, will reserve 1px for itself ONLY when visible.
        // It will not in FireFox, so there is no need to adjust the margin
        if (navigator.appVersion.indexOf("MSIE") > -1) {
            mainTable.style.marginTop = "1px";
        }

        callOutStructure.style.visibility = "hidden";
        callOutStructure.style.display = "none";
    }

    var handlingMessageLabel = document.getElementById(handlingMessageLabelID);

    if (handlingMessageLabel) {
        var currentHandlingMessageField = document.getElementById(currentHandlingMessageFieldID);

        if (currentHandlingMessageField) {
            handlingMessageLabel.innerHTML = currentHandlingMessageField.value;
        }
    }
}

function OnSizeClick(e, disabledClassName, selectedClassName, sizeStructureID, selectedSizeLongNameLabelID, longName, selectedSkuFieldID, sizeSku, sizeSkuCode, skuCodeContainer, selectedSkuRequiredFieldValidatorID, alternateHandlingMessage, handlingMessageLabelID, currentHandlingMessageFieldID, originalHandlingMessageFieldID, addToCartHandlingMessageID, addToCartHandlingMessage) {
    SizeReset();

    var sizeStructure = document.getElementById(sizeStructureID);

    if (sizeStructure && sizeStructure.className != disabledClassName && sizeStructure.className != selectedClassName) {
        sizeStructure.className = selectedClassName;

        var selectedSkuField = document.getElementById(selectedSkuFieldID);

        if (selectedSkuField) {
            if (typeof (OmnitureSelectedSkuCodeContainer) != 'undefined' && skuCodeContainer) {
                eval(skuCodeContainer + ' = sizeSkuCode');
            }

            selectedSkuField.value = sizeSku;

            var selectedSizeLongNameLabel = document.getElementById(selectedSizeLongNameLabelID);

            if (selectedSizeLongNameLabel) {
                selectedSizeLongNameLabel.innerHTML = longName

                var selectedSkuRequiredFieldValidator = document.getElementById(selectedSkuRequiredFieldValidatorID);

                if (selectedSkuRequiredFieldValidator) {
                    selectedSkuRequiredFieldValidator.style.visibility = "hidden";

                    var handlingMessageLabel = document.getElementById(handlingMessageLabelID);
                    var currentHandlingMessageField = document.getElementById(currentHandlingMessageFieldID);

                    if (handlingMessageLabel) {
                        if (alternateHandlingMessage && alternateHandlingMessage.length > 0) {
                            if (currentHandlingMessageField) {
                                currentHandlingMessageField.value = alternateHandlingMessage;
                            }

                            handlingMessageLabel.innerHTML = alternateHandlingMessage;
                        }
                        else {
                            var originalHandlingMessageField = document.getElementById(originalHandlingMessageFieldID);

                            if (currentHandlingMessageField) {
                                currentHandlingMessageField.value = originalHandlingMessageField.value;
                            }

                            handlingMessageLabel.innerHTML = originalHandlingMessageField.value;
                        }
                    }

                    var addToCartHandlingMessageLabel = document.getElementById(addToCartHandlingMessageID);

                    if (addToCartHandlingMessageLabel) {
                        if (addToCartHandlingMessage && addToCartHandlingMessage.length > 0) {
                            addToCartHandlingMessageLabel.innerHTML = addToCartHandlingMessage;
                        }
                    }
                }
            }
        }
    }
}

function OnRadioSizeClick(selectedSkuFieldID, skuId, skuCode, skuCodeContainer) {
    var selectedSkuField = document.getElementById(selectedSkuFieldID);

    if (selectedSkuField) {
        selectedSkuField.value = skuId;
        if (typeof (OmnitureSelectedSkuCodeContainer) != 'undefined' && skuCodeContainer) {
            eval(skuCodeContainer + ' = skuCode');
        }
    }
}

function SizeReset() {
    $("td[ctl=SizeTD]").each(function() {
        var ctl = $(this);
        ctl.removeClass();
        ctl.addClass(ctl.attr("oldClass"));
    });
}

function IsChildOf(target, container) {
    var count = 0;

    while (target) {
        if (target == container) {
            if (count == 0) {
                return false
            }
            else {
                return true;
            }
        }

        target = target.parentNode;
    }

    return false;
}