var LAST_BANNER_INDEX = -1;
var MAIN_TIMER;
var IS_RUNNING;
var LOCKED = false;
var DELAY = 10000;
var IMAGE_WIDTH = 328;
var WAIT_FOR_START = 500;
//banery sou nacteny z externiho souboru
var teasers;
var EFFECT;

function getNextIndex() {
    LAST_BANNER_INDEX = computeNextIndex(LAST_BANNER_INDEX);
    return LAST_BANNER_INDEX
}

function computeNextIndex(value) {
    if (value + 1 < teasers.length) {
        value += 1;
    } else {
        value = 0;
    }
    return value;
}


function getPreviousIndex() {
    LAST_BANNER_INDEX = computePreviousIndex(LAST_BANNER_INDEX)
    return LAST_BANNER_INDEX;
}

function computePreviousIndex(value) {
    if (value > 0) {
        value -= 1;
    } else {
        value = teasers.length - 1;
    }
    return value;
}

function isSingleImage() {
    return teasers.length <= 1;
}

function start(disableEfect) {
    EFFECT(getNextIndex(), disableEfect);
    if (isSingleImage()) {
        return;
    }
    MAIN_TIMER = setInterval(function() {
        nextImage()
    }, DELAY);
    IS_RUNNING = true;
}

function stop() {
    clearInterval(MAIN_TIMER);
    IS_RUNNING = false;
}

function toggle() {
    if (isSingleImage()) {
        return;
    }
    if (LOCKED) {
        return;
    }
    if (IS_RUNNING) {
        stop();
    } else {
        start(false);
    }
}


function setOpacity ( obj, opacity ) {

    opacity = (opacity == 100 ? 99.999 : opacity);

    obj.style.filter = "progid:DXImageTransform.Microsoft.Alpha(Opacity=" + opacity + ")";
    obj.style.filter = "alpha(opacity:" + opacity + ")";
    obj.style.KHTMLOpacity = opacity / 100;  // Safari<1.2, Konqueror
    obj.style.MozOpacity = opacity / 100;  // Older Mozilla and Firefox
    obj.style.opacity = opacity / 100;  // Safari 1.2, newer Firefox and Mozilla, CSS3  
}

function replaceNode(parentNode, textNode) {
    if (parentNode.hasChildNodes()) {
        parentNode.replaceChild(textNode, parentNode.firstChild);
    } else {
        parentNode.appendChild(textNode);
    }

}


function setImage(index) {

    var imageNode = document.getElementById("teaser-target-image");
    var hiddenImageNode = document.getElementById("teaser-hidden-image");

    var linkNode = document.getElementById("teaser-link");
    var linkImageNode = document.getElementById("teaser-image-link");
    var textNode = document.getElementById("teaser-text");
    var infoNode = document.getElementById("teaser-info");
    var navNode = document.getElementById("teaser-nav-" + index);

    var linkHiddenNode = document.getElementById("teaser-link-hidden");
    var textHiddenNode = document.getElementById("teaser-text-hidden");
    var infoHiddenNode = document.getElementById("teaser-info-hidden");


    linkNode.setAttribute("href", teasers[index][1]);
    linkImageNode.setAttribute("href", teasers[index][1]);
    imageNode.setAttribute("src", teasers[index][0]);

    nextIndex = computeNextIndex(index);
    linkHiddenNode.setAttribute("href", teasers[nextIndex][1]);
    

    hiddenImageNode.setAttribute("src", teasers[nextIndex][0])

    for (var i=0; i<teasers.length; i++) {
        pNavNode = document.getElementById("teaser-nav-" + i);
        pNavNode.className = "noactive";
    }

    navNode.className = "active";

    var newTextNode = document.createTextNode(teasers[index][2]);
    var newInfoNode = document.createTextNode(teasers[index][3]);

    var newNextTextNode = document.createTextNode(teasers[nextIndex][2]);
    var newNextInfoNode = document.createTextNode(teasers[nextIndex][3]);

    replaceNode(textNode, newTextNode);
    replaceNode(infoNode, newInfoNode);

    replaceNode(textHiddenNode, newNextTextNode);
    replaceNode(infoHiddenNode, newNextInfoNode);
}

function doUp(obj, funct, value, step, maxValue, delay, postUp, computeStep) {
    if (value <= maxValue && obj) {
        funct(obj, value);
        value += computeStep(value, step, maxValue);
        setTimeout( function () {
            doUp(obj, funct, value, step, maxValue, delay, postUp, computeStep);
        }, delay);
    } else {
        if (postUp) {
            postUp( obj, value );
        }
    }
}

function doDown(obj, funct, value, step, minValue, delay, postDown, computeStep) {
    if ( value >= minValue && obj ) {
        funct( obj, value );
        value -= computeStep(value, step, minValue);
        setTimeout( function () {
            doDown ( obj, funct, value, step, minValue, delay, postDown, computeStep );
        }, delay );
    } else {
        if (postDown) {
            postDown(obj, value);
        }
    }
}


function fadeIn(obj, postFadeIn) {
    doUp(obj, setOpacity, 0, 5, 100, 40, postFadeIn, function(value, step, maxValue) {return step});
}

function fadeOut(obj, postFadeOut) {
    doDown(obj, setOpacity, 100, 5, 0, 40, postFadeOut, function(value, step, minValue) {return step});
}

function nextImage() {
    if (!isSingleImage()) {
        if (LOCKED) {
            return;
        }
        EFFECT(getNextIndex());
    }
}

function previousImage() {
    if (!isSingleImage()) {
        if (LOCKED) {
            return;
        }
        EFFECT(getPreviousIndex());
    }
}

function moveObj(obj, left) {
    if (obj.constructor == Array) {
        for (var i = 0; i< obj.length; i++) {
            obj[i].style.left = "-" + left + "px";
        }
    } else {
        obj.style.left = "-" + left + "px";
    }
}

function moveImage(index, disableEffect) {
    if (index >= 0) {
        LOCKED = true;
        var targetImage = document.getElementById("teaser-target-image");
        var targetText = document.getElementById("teaser-text-area");
        if (disableEffect) {
            setImage(index);
            LOCKED = false;
            return;
        }
        var composite = new Array(targetImage, targetText);
        doUp(composite, moveObj, 0, 25, IMAGE_WIDTH, 70, function(){
            setImage(index);
            targetImage.style.left = "0";
            targetText.style.left = "0";
            LOCKED = false;
        }, function(value, step, maxValue){
            if (value > ( 3 * maxValue / 4)) {
                return step * Math.max((4 * (maxValue - value)/ (maxValue)), 0.05);
            }
            if (value < ( maxValue / 4)) {
                return step * Math.max((8 * (1 - (maxValue - value)/ maxValue)), 0.05);
                return step;
            } else {
                return step;
            }
        });
    }
}

function fadeImage(index, disableEffect) {
    if (index >= 0) {
        LOCKED = true;
        var targetImage = document.getElementById("teaser-target-image");
        var targetHiddenImage = document.getElementById("teaser-hidden-image");
        targetHiddenImage.style.display = "none";
        if (disableEffect) {
            setImage(index);
            LOCKED = false;
            return;
        }
        fadeOut(targetImage, function() {
            setImage(index);
            fadeIn(targetImage, function() {
                LOCKED = false
            });
        }
        )
    }
}

function initialize() {
    EFFECT = fadeImage;
    //EFFECT = moveImage;
    document.getElementById("teaser").style.display = "block";
    
    for (var j=0; j<teasers.length; j++) {
        nav = document.getElementById("teaser-nav-" + j);
        nav.setAttribute("href", teasers[j][1]);
        nav.onmouseover = function (value) {
            return function() {
                LAST_BANNER_INDEX = value;
                stop();
                setImage(value);
            }
        }(j);
    }

    addEvent(document.getElementById("teasers"), 'mouseleave', function() {
        waitForStart();
    }, false);
    
    start(true);
    
}

function waitForStart() {
    if (IS_RUNNING) {
        return;
    }
    if (!LOCKED) {
        getPreviousIndex();
        start(true);
    } else {
        setTimeout(waitForStart, WAIT_FOR_START)
    }
}

function addEvent(_elem, _evtName, _fn, _useCapture) {
    if (typeof _elem.addEventListener != 'undefined')
    {
        if (_evtName === 'mouseenter')
        {
            _elem.addEventListener('mouseover', mouseEnter(_fn), _useCapture);
        }
        else if (_evtName === 'mouseleave')
        {
            _elem.addEventListener('mouseout', mouseEnter(_fn), _useCapture);
        }
        else
        {
            _elem.addEventListener(_evtName, _fn, _useCapture);
        }
    }
    else if (typeof _elem.attachEvent != 'undefined')
    {
        _elem.attachEvent('on' + _evtName, _fn);
    }
    else
    {
        _elem['on' + _evtName] = _fn;
    }
}

function mouseEnter(_fn) {
    return function(_evt)
    {
        var relTarget = _evt.relatedTarget;
        if (this === relTarget || isAChildOf(this, relTarget))
        {
            return;
        }

        _fn.call(this, _evt);
    }
}

function isAChildOf(_parent, _child) {
    if (_parent === _child) {
        return false;
    }
    while (_child && _child !== _parent)
    {
        _child = _child.parentNode;
    }

    return _child === _parent;
}

