var Tcc = {};
if (typeof (Tcc) == "undefined") {
    var Tcc = {};
}

/* BEGIN: jQuery reverse */

$.fn.reverse = [].reverse;

/* END: jQuery reverse */

/* BEGIN: Carousel v2 */

$(function () {
    function initHighlightsCarousel($carouselElements, centerImagesOnPage) {
        $carouselElements.each(function (index, carouselElement) {
            function centreCarouselOnElement($element, scrollCompleteCallback) {
                getCentreItem().removeClass("centreItem");
                if (!$element || $element.length == 0) {
                    return;
                }
                var halfViewportWidth = parseInt(getViewportWidth() / 2);
                var wrapperLeftPadding = parseInt($carouselViewport.css("padding-left"));
                var newCarouselOffset = halfViewportWidth - parseInt($element.outerWidth(true) / 2) - $element.offset().left + $element.parent().offset().left + parseInt($element.css("margin-left"));
                setCarouselOffset(newCarouselOffset, scrollCompleteCallback);
                setCentreItem($element);
            };
            // centre the carousel on the centre image on the first page
            function centreCentreItemOnFirstPage(scrollCompleteCallback) {
                var halfViewportWidth = parseInt(getViewportWidth() / 2);
                // find the centre item
                var $centreItem = null;
                var wrapperLeftPadding = parseInt($carouselViewport.css("padding-left"));
                $carouselItems.each(function (itemIndex) {
                    var $carouselItem = $(this);
                    var carouselItemOffset = $carouselItem.offset().left - $carouselItem.offsetParent().offset().left - wrapperLeftPadding - parseInt($carouselItem.css("margin-left"));
                    var halfWidthOfNextCarouselItem = parseInt($carouselItem.next().outerWidth(true) / 2);
                    if (carouselItemOffset + $carouselItem.outerWidth(true) + halfWidthOfNextCarouselItem > halfViewportWidth) {
                        $centreItem = $carouselItem;
                        return false;
                    }
                });
                if (!$centreItem) {
                    return;
                }
                // centre carousel around the new item
                centreCarouselOnElement($centreItem, scrollCompleteCallback);
            };
            function getCarouselOffset() {
                var offsetAsInt = parseInt($carouselElement.css("left"));
                return $.isNaN(offsetAsInt) ? 0 : offsetAsInt;
            };
            function getCentreItem() {
                return $carouselItems.filter(".centreItem");
            };
            function getElementOffsetInCarousel($element) {
                var offset = 0;
                $element.prevAll().each(function () {
                    offset += $(this).outerWidth(true);
                });
                return offset;
            };
            function getViewportWidth() {
                return parseInt($carouselViewport.width());
            };
            function isCarouselItemVisible($element) {
                var elementX1 = getElementOffsetInCarousel($element);
                var elementX2 = elementX1 + $element.outerWidth(true);
                var viewportX1 = parseInt($carouselElement.css("left")) * -1;
                var viewportX2 = viewportX1 + getViewportWidth();
                return elementX1 > viewportX1 && elementX1 < viewportX2 && elementX2 > viewportX1 && elementX2 < viewportX2;
            };
            function pageWidth() {
                return parseInt(getViewportWidth() * .8);
            };
            // set direction to (N)ext or (P)revious
            function scrollToAdjacentPage(direction) {
                // check a valid direction was sent
                if (scrollingDisabled || (direction != "N" && direction != "P")) {
                    return;
                }
                // check if the first or last element is already displayed and if we are still trying to scroll in that direction
                if ((direction == "P" && parseInt($carouselElement.css("left")) > 0) || (direction == "N" && (parseInt($carouselElement.css("left")) * -1) + getViewportWidth() > carouselWidth)) {
                    return;
                }

                if (centerImagesOnPage) {
                    var itemsInViewport = new Array();
                    var viewportLeftPos = $carouselViewport.offset().left;
                    var viewportRightPos = viewportLeftPos + $carouselViewport.width();
                    $carouselItems.each(function (index, element) {
                        var $element = $(element);
                        var elementLeftPos = $element.offset().left;
                        if (elementLeftPos > viewportLeftPos && elementLeftPos + $element.outerWidth(true) < viewportRightPos) {
                            itemsInViewport.push($element);
                        } else if (itemsInViewport.length > 0) {
                            return false;
                        }
                    });

                    var itemsInViewportCount = itemsInViewport.length;
                    var $newCentreItem = getCentreItem();
                    for (var i = 0; i < itemsInViewportCount; i++) {
                        if ((direction == "N" && $carouselItems.index($newCentreItem) + itemsInViewportCount > $carouselItems.length) || (direction == "P" && $carouselItems.index($newCentreItem) - itemsInViewportCount < -1)) {
                            break;
                        }
                        $newCentreItem = direction == "N" ? $newCentreItem.next() : $newCentreItem.prev();
                    }
                    if ($newCentreItem.length != 0) {
                        centreCarouselOnElement($newCentreItem);
                    }
                } else {
                    var scrollDistance = parseInt(getViewportWidth() * .8);
                    var newOffset = 0;
                    // check we aren't trying to scroll past the end of the carousel
                    if (direction == "N" && (getCarouselOffset() - scrollDistance - getViewportWidth()) * -1 > carouselWidth) {
                        newOffset = (carouselWidth - getViewportWidth()) * -1;
                    } else if (direction == "P" && getCarouselOffset() + scrollDistance > 0) {
                        newOffset = 0;
                    } else {
                        newOffset = direction == "N" ? getCarouselOffset() - scrollDistance : getCarouselOffset() + scrollDistance;
                    }
                    setCarouselOffset(newOffset);
                }
            }
            function scrollToNextPage() {
                scrollToAdjacentPage("N");
            };
            function scrollToPreviousPage() {
                scrollToAdjacentPage("P");
            };
            function setCarouselOffset(offset, scrollCompleteCallback) {
                if (!scrollingDisabled) {
                    scrollingDisabled = true;
                    $carouselElement.animate({ left: offset }, 200, "swing", function () {
                        if ($.isFunction(scrollCompleteCallback)) {
                            scrollCompleteCallback();
                        }
                        scrollingDisabled = false;
                    });
                }
            };
            function setCentreItem($element) {
                $element.addClass("centreItem");
            };

            var scrollingDisabled = false;
            // save carousel jQuery object in local variable
            var $carouselElement = $(carouselElement);
            // save carousel items jQuery object in local variable
            var $carouselItems = $carouselElement.children();
            // set carousel width
            var carouselWidth = 0;
            $carouselItems.each(function () {
                carouselWidth += $(this).outerWidth(true);
            });
            $carouselElement.width(carouselWidth);
            // wrap in a "viewport" element
            $carouselElement.wrap("<div class=\"carousel2Viewport\" />");
            // save viewport jQuery object in local variable
            var $carouselViewport = $carouselElement.parent();
            // set the height of the viewport
            $carouselViewport.animate({ height: $carouselElement.outerHeight(true) }, 400);
            // add paging controls
            $carouselViewport.append("<div class=\"paging previous\" /><div class=\"paging next\" />");
            // save paging controls jQuery objects in local variables
            var $pagingNext = $carouselViewport.children(".paging.next");
            var $pagingPrevious = $carouselViewport.children(".paging.previous");
            // centre on load
            if (centerImagesOnPage) {
                centreCentreItemOnFirstPage(function () {
                    // wire up the paging controls
                    $pagingNext.click(scrollToNextPage);
                    $pagingPrevious.click(scrollToPreviousPage);
                });
            } else {
                // wire up the paging controls
                $pagingNext.click(scrollToNextPage);
                $pagingPrevious.click(scrollToPreviousPage);
            }
            // re-centre on orientation change
            $(window).bind("orientationchange", function () { setTimeout(function () { centreCarouselOnElement(getCentreItem()); }, 200) });
        });

    };
    initHighlightsCarousel($(".carousel2"), false);
});

/* END: Carousel v2 */

