$(window).load(function () {
    carousel.start();
    $("#key > .imageryLabel").fadeIn();
});

$(window).resize(function () {
    if (classified.is("webkit")) {
        stretch();
    }
});

function stretch() {
    var centerFadeWidth = $("div#centerFade").width();
    var windowWidth = $(window).width();
    $("div.stretch").width(Math.floor((windowWidth - centerFadeWidth) / 2) + 50);
}

$(document).ready(function () {

    $(".imageryLabel").fadeOut(0);

    adjustWithWindow();

    if (classified.is("webkit")) {
        stretch();
    }

    if (classified.is("lt-ie9")) {
        Array.prototype.indexOf = function (match) {
            for (var i = 0; i < this.length; i++) {
                if (this[i] === match) {
                    return i;
                }
            }
            return -1;
        };
    }

    if (classified.is("ie")) {
        if ("onfocusin" in document) {
            document.onfocusin = function () {
                carousel.start();
            };
            document.onfocusout = function () {
                carousel.stop();
            };
        }
    }

    if (!classified.is("ie")) {
        $(window).focus(function () {
            carousel.start();
        }).blur(function () {
            carousel.stop();
        });
        $(document).focus(function () {
            carousel.start();
        }).blur(function () {
            carousel.stop();
        });
    }

    carousel = (function () {
        var obj = {};
        var img_text = ["<p>120 NORTH POINTE - <span>LANCASTER, PA</span></p>",
					"<p>1800 FRUITVILLE PIKE - <span>LANCASTER, PA</span></p>",
					"<p>THE SHOPPES AT BLOOMFIELD VILLAGE - <span>LITITZ, PA</span></p>",
					"<p>UNION NATIONAL COMMUNITY BANK - <span>LANCASTER, PA</span></p>",
					"<p>QUEENSGATE TOWNE CENTER - <span>YORK, PA</span></p>",
					"<p>SOUTH HANOVER SHOPPING CENTER - <span>HANOVER, PA</span></p>",
					"<p>WINDSOR COMMONS APARTMENTS - <span>RED LION, PA</span></p>"];

        //
        // Methods

        obj.init = function (o) {
            obj.imageryContainers = o.imageryContainers;
            obj.imagery = o.imagery;
            obj.key = o.key;
            obj.normalImageryWidth = o.normalImageryWidth;
            obj.marginSize = 20;
            obj.keyWidth = obj.normalImageryWidth + (obj.marginSize * 2);
            obj.keyTop = -10;

            obj.leftPtForKey = calculateLeftPtForKey(obj);
            obj.orderedImagery = getOrderedImagery(obj);

            setKeyPosition(obj);
            setImageryLeftOfKey(obj);
            setImageryRightOfKey(obj);

            obj.orderedImageryPositions = getOrderedImageryPositions(obj);

            if ($(window).width() > obj.width()) {
                obj.adjustWidth();
            }


            console.log(obj.orderedImageryPositions);
        };

        obj.start = function () {
            obj.stop();
            obj.intervalId = setInterval(function () { obj.animate(); }, 10000);

        };

        obj.stop = function () {
            clearInterval(obj.intervalId);
            obj.intervalId = null;
        };

        obj.animate = function () {
            var keyCount = 0;
            var easing = "easeInOutSine";
            var rate = 750;
            $(".rollover").css("display", "none");
            $.each(obj.orderedImagery, function (k, v) {
                $v = $(v);

                if (k != 0) {
                    if ($v.attr("id") == "key" && keyCount == 0) {
                        $v.animate({ "top": 0, "left": obj.orderedImageryPositions[k - 1] }, rate, easing, function () {
                            obj.orderedImagery = updateOrderedImagery(obj);
                        });
                        $v.css("width", obj.normalImageryWidth);
                        $v.children(":first-child").animate({ "width": obj.normalImageryWidth }, rate);
                        $v.attr("id", "");
                        $(obj.orderedImagery[k + 1]).attr("id", "key");
                        keyCount++;
                        $v.children(".imageryLabel").fadeOut();

                    } else if ($v.attr("id") == "key" && keyCount == 1) {
                        $v.css({ "width": obj.keyWidth });
                        $v.animate({ "top": obj.keyTop, "left": obj.orderedImageryPositions[k - 1] }, rate, easing, function () {
                            obj.orderedImagery = updateOrderedImagery(obj);
                        });
                        $v.children(":first-child").animate({ "width": obj.keyWidth }, rate);
                        keyCount++;
                        $v.children(".imageryLabel").fadeIn();
                    } else {
                        $v.animate({ "left": obj.orderedImageryPositions[k - 1] }, rate, easing, function () {
                            obj.orderedImagery = updateOrderedImagery(obj);
                        });
                    }
                } else {
                    $v.animate({ "left": (((obj.normalImageryWidth + (obj.marginSize * 2)) * -1)) }, rate, easing, function () {
                        $(this).css("left", obj.orderedImageryPositions[obj.orderedImageryPositions.length - 1]);
                        obj.orderedImagery = updateOrderedImagery(obj);


                    });
                }
            });
            obj.imageryContainers = $(".imagery");
            obj.imagery = $(".imagery > img");
            obj.key = $("#key");
        };

        obj.animateTo = function (element) {
            $(".rollover").css("display", "none");
            if (!$(element).is(":animated")) {
                obj.stop();
                var keyIndex = obj.orderedImageryPositions.indexOf(parseInt(obj.leftPtForKey) + "px")
                var newIndex = obj.orderedImageryPositions.indexOf($(element).css("left"));
                var difference = keyIndex - newIndex;
                var keyCount = 0;
                var easing = "easeInOutSine";
                var rate = 750;
                if (difference != 0) {
                    $.each(obj.orderedImagery, function (k, v) {
                        $v = $(v);

                        // 
                        // if difference is negative, images are moving from right to left.
                        // if difference is positive, images are moving from left to right.
                        if (difference < 0) {
                            // IMAGES MOVING RIGHT TO LEFT
                            // if k + difference is negative, the image must be recycled
                            // if k + difference is positive, the image only needs to be moved
                            // add 1 to account for array 0 indexing
                            if ((k + difference) >= 0) {
                                if ($v.attr("id") == "key" && k == keyIndex) {
                                    $v.animate({ "top": 0, "left": obj.orderedImageryPositions[k + difference] }, rate, easing, function () {
                                        obj.orderedImagery = updateOrderedImagery(obj);
                                    });
                                    $v.css("width", obj.normalImageryWidth);
                                    $v.children(":first-child").animate({ "width": obj.normalImageryWidth }, rate);
                                    $v.attr("id", "");
                                    $(obj.orderedImagery[newIndex]).attr("id", "key");
                                    $v.children(".imageryLabel").fadeOut();
                                } else if ($v.attr("id") == "key" && k == newIndex) {
                                    $v.css({ "width": obj.keyWidth });
                                    $v.animate({ "top": obj.keyTop, "left": obj.orderedImageryPositions[k + difference] }, rate, easing, function () {
                                        obj.orderedImagery = updateOrderedImagery(obj);
                                    });
                                    $v.children(":first-child").animate({ "width": obj.keyWidth }, rate);
                                    $v.children(".imageryLabel").fadeIn();
                                } else {
                                    $v.animate({ "left": obj.orderedImageryPositions[k + difference] }, rate, easing, function () {
                                        obj.orderedImagery = updateOrderedImagery(obj);
                                    });
                                }
                            } else if ((k + difference) < 0) {
                                var movementLeftBeforeRecycle = (k + difference) * (obj.normalImageryWidth + obj.marginSize);
                                var $vCopy = $v.clone(true, false);
                                $("#imageCarousel").append($vCopy);
                                var copyLeft = (parseInt(obj.orderedImageryPositions[obj.orderedImageryPositions.length + (k + difference)]) + ((obj.normalImageryWidth + obj.marginSize) * Math.abs(difference)));
                                $vCopy.css({ "left": copyLeft, "top": 0 });
                                $vCopy.children("img").css({ "width": obj.normalImageryWidth });
                                $vCopy.animate({ "left": "-=" + ((obj.normalImageryWidth + obj.marginSize) * Math.abs(difference)) }, rate, easing, function () {
                                    $vCopy.remove();
                                });
                                $v.animate({ "top": 0, "left": movementLeftBeforeRecycle }, rate, easing, function () {
                                    $(this).css("left", obj.orderedImageryPositions[obj.orderedImageryPositions.length + (k + difference)]);
                                    obj.orderedImagery = updateOrderedImagery(obj);
                                });
                            }
                        } else if (difference > 0) {
                            // IMAGES MOVING LEFT TO RIGHT
                            // if k + difference is greater than or equal to the length of the position array, the image must be recycled
                            // if k + difference is less than the length of the array, the image only needs to be moved
                            if ((k + difference) < obj.orderedImageryPositions.length) {
                                if (k == keyIndex) {
                                    $v.animate({ "top": 0, "left": obj.orderedImageryPositions[k + difference] }, rate, easing, function () {
                                        obj.orderedImagery = updateOrderedImagery(obj);
                                    });
                                    $v.css("width", obj.normalImageryWidth);
                                    $v.children(":first-child").animate({ "width": obj.normalImageryWidth }, rate);
                                    $v.attr("id", "");
                                    $(obj.orderedImagery[newIndex]).attr("id", "key");
                                    $v.children(".imageryLabel").fadeOut();
                                } else if (k == newIndex) {
                                    $v.css({ "width": obj.keyWidth });
                                    $v.animate({ "top": obj.keyTop, "left": obj.orderedImageryPositions[k + difference] }, rate, easing, function () {
                                        obj.orderedImagery = updateOrderedImagery(obj);
                                    });
                                    $v.children(":first-child").animate({ "width": obj.keyWidth }, rate);
                                    $v.attr("id", "key");
                                    $v.children(".imageryLabel").fadeIn();
                                } else {
                                    $v.animate({ "left": obj.orderedImageryPositions[k + difference] }, rate, easing, function () {
                                        obj.orderedImagery = updateOrderedImagery(obj);
                                    });
                                }
                            } else if ((k + difference) >= obj.orderedImageryPositions.length) {
                                var movementLeftBeforeRecycle = (k + difference) * (obj.normalImageryWidth + obj.marginSize);
                                var $vCopy = $v.clone(true, false);
                                $("#imageCarousel").append($vCopy);
                                var copyLeft = (parseInt(obj.orderedImageryPositions[(k + difference) - obj.orderedImageryPositions.length]) - ((obj.normalImageryWidth + obj.marginSize) * Math.abs(difference)));
                                $vCopy.css({ "left": copyLeft, "top": 0 });
                                $vCopy.children("img").css({ "width": obj.normalImageryWidth });
                                $vCopy.animate({ "left": "+=" + ((obj.normalImageryWidth + obj.marginSize) * Math.abs(difference)) }, rate, easing, function () {
                                    $vCopy.remove();
                                });
                                $v.animate({ "top": 0, "left": movementLeftBeforeRecycle, "width": obj.normalImageryWidth }, rate, easing, function () {
                                    $(this).css({ "left": obj.orderedImageryPositions[(k + difference) - obj.orderedImageryPositions.length], "top": 0, "width": obj.normalImageryWidth });
                                    $(this).children("img").width(obj.normalImageryWidth);
                                    obj.orderedImagery = updateOrderedImagery(obj);
                                });
                            }
                        }
                    });
                }
                obj.start();
            }
        };

        obj.width = function () {
            var firstLeft = parseInt(obj.orderedImageryPositions[0]);
            var lastLeft = parseInt(obj.orderedImageryPositions[obj.orderedImageryPositions.length - 1]);
            var lastWidth = obj.normalImageryWidth;
            return ((lastLeft + lastWidth) - firstLeft);
        }

        //
        // Helpers

        obj.adjustWidth = function (i) {
            obj.stop();

            //var $temp = $(obj.orderedImagery);
            //var $clone = $temp.clone(true);
            obj.orderedImagery.concat(obj.orderedImagery.slice());

            obj.imageryContainers = $(obj.orderedImagery);
            obj.imagery = $(obj.orderedImagery).children("img");
            obj.key = $("#key");
            obj.normalImageryWidth = 293;
            obj.leftPtForKey = calculateLeftPtForKey(obj);
            //obj.orderedImagery = getOrderedImagery(obj);

            setKeyPosition(obj);
            setImageryLeftOfKey(obj);
            setImageryRightOfKey(obj);

            obj.orderedImageryPositions = getOrderedImageryPositions(obj);
            updateOrderedImagery(obj);

            if ($(window).width() > obj.width()) {
                obj.adjustWidth();
            }

            obj.start();
        };

        var calculateLeftPtForKey = function (o) {
            var centerPoint = $(window).width() / 2;
            var leftPtForKey = centerPoint - (o.keyWidth / 2);

            return leftPtForKey;
        };

        var getOrderedImagery = function () {
            var arr = [];
            var numLeftOfKey = Math.ceil(obj.leftPtForKey / (obj.normalImageryWidth + obj.marginSize));

            for (var i = 0; i < numLeftOfKey; i++) {
                if (obj.imageryContainers.eq(i).attr("id") != "key") {
                    arr.push(obj.imageryContainers.eq(i));
                } else {
                    numLeftOfKey++;
                }
            }

            arr.push($(obj.key));

            for (; i < obj.imageryContainers.length; i++) {
                if (obj.imageryContainers.eq(i).attr("id") != "key") {
                    arr.push(obj.imageryContainers.eq(i));
                }
            }

            return arr;
        };

        var updateOrderedImagery = function (o) {
            var arr = o.orderedImagery.slice();
            var imagerySort = function (a, b) {
                return parseInt($(a).css("left")) - parseInt($(b).css("left"));
            };

            arr.sort(imagerySort);
            for (var i = 0; i < arr.length; i++) {
                $(arr[i]).addClass("imagery");
            }

            return arr;
        };

        var setKeyPosition = function (o) {
            $(o.key).css({ "left": o.leftPtForKey, "top": o.keyTop, "width": o.keyWidth });
            $(o.key).children(":first-child").css({ "width": o.keyWidth });
        };

        var setImageryLeftOfKey = function (o) {
            var imageryLeftOfKey = [];
            $.each(o.orderedImagery, function (k, v) {
                if ($(v).attr("id") != "key") {
                    imageryLeftOfKey.push($(v));
                } else {
                    return false;
                }
            });
            imageryLeftOfKey.reverse();
            for (var i = 0; i < imageryLeftOfKey.length; i++) {
                var $thisImagery = $(imageryLeftOfKey[i]);
                $thisImagery.css("left", (o.leftPtForKey - (o.normalImageryWidth * (i + 1)) - (o.marginSize * (i + 1))));
            }

            return imageryLeftOfKey;
        };

        var setImageryRightOfKey = function (o) {
            var imageryRightOfKey = [];
            var reverseOrderImagery = o.orderedImagery.slice();
            reverseOrderImagery.reverse();
            $.each(reverseOrderImagery, function (k, v) {
                if ($(v).attr("id") != "key") {
                    imageryRightOfKey.push($(v));
                } else {
                    return false;
                }
            });
            imageryRightOfKey.reverse();
            for (var i = 0; i < imageryRightOfKey.length; i++) {
                var $thisImagery = $(imageryRightOfKey[i]);
                $thisImagery.css("left", (o.leftPtForKey + o.keyWidth + (o.normalImageryWidth * i) + (o.marginSize * (i + 1))));
            }

            return imageryRightOfKey;
        };

        var getOrderedImageryPositions = function (o) {
            var arr = [];
            for (var i = 0; i < o.orderedImagery.length; i++) {
                arr.push(o.orderedImagery[i].css("left"));
            }
            return arr;
        };

        //
        // Events

        $(".imagery").hover(function () {
            if ($(this).attr("id") != "key" && !$(this).is(":animated")) {
                $(this).children(".rollover").css("display", "block");
            }
        }, function () {
            $(this).children(".rollover").css("display", "none");
        });

        $(".imagery").click(function () {
            obj.animateTo($(this));
        });

        $(window).resize(function () {
            carousel.stop();
            carousel.init({ imageryContainers: $(".imagery"), imagery: $(".imagery > img"), key: $("#key"), normalImageryWidth: 293 });
            carousel.adjustWidth();
            carousel.start();
        });



        return obj;
    } ());

    carousel.init({ imageryContainers: $(".imagery"), imagery: $(".imagery > img"), key: $("#key"), normalImageryWidth: 293 });
});     
