
var carouselScrollInterval = 7000; // carousel scroll in milliseconds
var carouselResumeScrollInterval = 7000; //carousel timeout for resuming scroll after click (ms) (total delay = scrollinterval + resumeinterval)
var carouselTransitionDuration = 2000; // carousel transition time (time to scroll new img) (ms)

// carousel IDs and classes
var carouselSelectedClass = "selected";
var carouselID = "#carousel";
var carouselContainer = "#carousel_container";
var carouselControls = "#carousel_controls";
var carouselTextContainer = "#carousel_text_container";
var carouselNoJSText = "#carousel_noJS_text";
var carouselIndexControl = "#carousel_index_control";
var carouselNextBtn = "#carousel_next";
var carouselPrevBtn = "#carousel_prev";

// called on first run to setup elements
function mycarousel_initCallback(carousel) {
    createCarouselControls(carousel);
    setCarouselAutoScroll(carousel, carouselScrollInterval);   
};

// creates links to control carousel
function createCarouselControls(carousel) {
    for (var i = 1; i <= carousel.size(); i++)
        $(carouselIndexControl).append("<a href='#'>" + i + "</a>");

    $(carouselIndexControl + ' a').bind('click', function() {
        setCarouselIndex(carousel, jQuery.jcarousel.intval(jQuery(this).text()));
        resetAutoScroll(carousel);
        return false;
    });

    $(carouselNextBtn).bind('click', function() {
        setCarouselIndex(carousel, carouselCurIndex+1);
        resetAutoScroll(carousel);
        return false;
    });

    $(carouselPrevBtn).bind('click', function() {
        setCarouselIndex(carousel, carouselCurIndex-1);
        resetAutoScroll(carousel);
        return false;
    });
}

var carouselCurIndex = 1;

function resetAutoScroll(carousel) {
    clearCarouselTimeout();
    clearCarouselInterval();
    carouselTimeoutID = setTimeout(function() { setCarouselAutoScroll(carousel, carouselScrollInterval) }, carouselResumeScrollInterval);
}

function setCarouselIndex(carousel, index) {
    if (carouselTransitioning) return;
    if (index > carouselCurIndex) {
        if (index > carousel.size()) {
            carouselCurIndex = 1;
        }
        else {
            carouselCurIndex = index;
        }
        carousel.next();
    }
    else if (index < carouselCurIndex) {
        if (index < 1) {
            carouselCurIndex = carousel.size();
        }
        else {
            carouselCurIndex = index;
        }
        carousel.prev();
    }
}

function clearCarouselInterval() {
    if (carouselIntervalID != "") {
        clearInterval(carouselIntervalID);
        carouselIntervalID = "";
    }
}

function clearCarouselTimeout() {
    if (carouselTimeoutID != "") {
        clearTimeout(carouselTimeoutID);
        carouselTimeoutID = "";
    } 
}

function mycarousel_firstInCallback(carousel, li, index, state) {
    $(carouselIndexControl + " a").removeClass(carouselSelectedClass);
    $(carouselIndexControl + " a").eq(carouselCurIndex - 1).addClass(carouselSelectedClass);
}

function mycarousel_itemVisibleInCallback(carousel, item, i, state, evt) {
    if (state != "init") carouselTransitioning = true;
    setCarouselTextValues();
    carousel.add(i, carouselImgArray[carouselCurIndex - 1]);
};

function mycarousel_itemVisibleOutCallback(carousel, item, i, state, evt){
    carousel.remove(i);
    carouselTransitioning = false;
};

function setCarouselTextValues() {
    $(carouselContainer).removeClass(carouselCurClass);
    $(carouselContainer).addClass(carouselClassArray[carouselCurIndex - 1]);
    $(carouselTextContainer).removeClass(carouselCurClass);
    $(carouselTextContainer).addClass(carouselClassArray[carouselCurIndex - 1]);
    $(carouselTextContainer).html("");
    $(carouselTextContainer).append(carouselTextArray[carouselCurIndex - 1]);
    carouselCurClass = carouselClassArray[carouselCurIndex - 1];
}

var carouselCurClass = "";
var carouselImgArray = new Array();
var carouselClassArray = new Array();
var carouselTextArray = new Array();
var carouselIntervalID = "";
var carouselTimeoutID = "";
var carouselTransitioning = false;
var carouselAutoScroll = false;

function setCarouselAutoScroll(carousel, timeout) {
    if (!carouselAutoScroll) return;
    carouselIntervalID = setInterval(function() { setCarouselIndex(carousel,carouselCurIndex+1) }, timeout);
}

function preCarouselInit() {
    $(carouselID).addClass("visible"); //show all li hidden by css
    $(carouselControls).addClass("visible"); //show control container
    $(carouselTextContainer).addClass("visible"); // show text container
    $(carouselID + " li > div").each(function(i) { carouselClassArray.push(this.className) });  //create array of classes on the LI
    $(carouselID + " li > div").removeClass();
    $(carouselID + " li > div > img").each(function(i) { carouselImgArray.push(this) }); //create array of current images for use later
    $(carouselID + " li > div > img").remove();
    $(carouselID + " li > div").each(function(i) { carouselTextArray.push(this.innerHTML) });
    $(carouselID + " li > div").remove();
    $(carouselNoJSText).remove();

    processCarouselArguments();
}

function processCarouselArguments() {
    if ($(carouselID).hasClass("autoscroll")) {
        carouselAutoScroll = true;
    }
    else {
        carouselAutoScroll = false;
    }
    // check if there are arguments passed in the class of #carousel and apply them
    var classes = $(carouselID).attr("class");
    if (classes != "") {
        var class_arr = classes.split(" ");
        for (i in class_arr) {
            if (class_arr[i].indexOf("=") != -1) {
                var values = class_arr[i].split("=");
                switch (values[0]) {
                    case "scroll":
                        carouselScrollInterval = parseInt(values[1]);
                        break;
                    case "resume":
                        carouselResumeScrollInterval = parseInt(values[1]);
                        break;
                    case "transition":
                        carouselTransitionDuration = parseInt(values[1]);
                        break;
                }
            }
        }
    }
}

jQuery(document).ready(function() {

    preCarouselInit();

    jQuery(carouselID).jcarousel({
        //don't use autoscroll here use custom function setCarouselAutoScroll
        scroll: 1,
        animation: carouselTransitionDuration,
        wrap: 'circular',
        easing: 'easeOutQuint',
        initCallback: mycarousel_initCallback,
        itemFirstInCallback: { onBeforeAnimation: mycarousel_firstInCallback },
        buttonNextHTML: null,
        buttonPrevHTML: null,
        itemVisibleInCallback: { onBeforeAnimation: mycarousel_itemVisibleInCallback },
        itemVisibleOutCallback: { onAfterAnimation: mycarousel_itemVisibleOutCallback }
    });
});


