/* 
 * ItemScroller.js
 *
 * @type Object
 * @author Thomas Monzel | Apparat-Hamburg
 * @description Steuern einer Liste von Items
 */

var ItemScroller = (function() {
    var doc = App.document;
    var imageContainer, menu, navArrows, textContainer, slideDirection = null;
    var useMenu = true;
    var useArrows = true;
    var animationInProgress = false;
    var currentImage = null;
    var first = true;
    var core = function(startIndex) {
        if(startIndex !== undefined) {
            core.navigateToItemAt(startIndex);
        }
    }

    $(window).resize(function(){
        // Bild wird bei Veränderung der Fenstergröße zentriert mitskaliert
        ImageResizer.scaleAroundCenter(currentImage);
    });

    core.useMenu = function(bool, hideOverview) {
        useMenu = bool;
        if(bool == false) {
            menu.empty();
            if(hideOverview == false) {
                var overviewButton = $('<a/>').attr('href', App.eldest.url + App.makeAnchor($.cookie(doc.type + '_search'))).addClass('bt-overview');
                overviewButton.tooltip("back to overview");
                menu.append(overviewButton);
            }
        }
    }

    core.navArrows = function(element, useThem) {
        navArrows = element;
        useArrows = useThem;
        if(useArrows == false) {
            navArrows.css('display', 'none');
        }
    }
    
    core.items = new ItemProvider();
    core.setup = function(menuElement, imageContainerElement, textContainerElement) {
        menu = menuElement;
        imageContainer = imageContainerElement;
        textContainer = textContainerElement;

        $(document).keydown(function(e) {
            var keyCode = (window.event) ? event.keyCode : e.keyCode;
            if(!animationInProgress) {
                switch(keyCode) {
                    case 39:
                        core.nextItem();
                    break;
                    case 37:
                        core.previousItem();
                }
            }
        });
    }

    core.addItem = function(item) {
        this.items.add(item);

        if(useMenu) {
            menu.append($('<a/>').attr('href', doc.url + '#' + item.alias).text(item.label).addClass('menu-item'));
        }
    }

    core.nextItem = function() {
        slideDirection = 'left';
        App.navigateToURL(doc.url + "#" + this.items.getNext().alias);
    }

    core.previousItem = function() {
        slideDirection = 'right';
        App.navigateToURL(doc.url + "#" + this.items.getPrevious().alias);
    }

    core.navigateToItemAt = function(index) {       
        var numItems = this.items.count(); // Anzahl der Items

        // Wenn keine Richtung für den nächsten Slide angegeben wird,
        // wird der Unterschied zum letzten Index für die Entscheidung verwendet
        if(slideDirection == null && first == false) {
            if(index < this.items.selectedIndex) {
                slideDirection = 'right';
            } else {
                slideDirection = 'left';
            }
        }
        
        // Für den gewählten Index das neue ItemObjekt holen
        var item = this.items.get(index);

        // Das letzt selektierte ItemObject ablegen
        var lastItem = this.items.selected;

        // Item selektieren(flag)
        this.items.select(index);

        // Letzten Menüpunkt deselektieren
        if(lastItem) {
            var lastLink = $('a', menu).eq(lastItem.attr('index'));
            lastLink.removeClass('selected');
        }

        $('div', navArrows).css('visibility', 'hidden');

        var nt = $('<img/>').addClass('nextTextImage');
        nt.attr('src', '');
        var textLayer = $('<div/>').css('position', 'absolute');
        var at = $('div', textContainer).eq(0);
        textContainer.append(textLayer);

        $('.loader-layer').css('display', 'block');

        var curIm = $('img', imageContainer).eq(0);
        var nextIm = $('<img/>').addClass('nextImage');
        nextIm.css('visibility', 'hidden');
        imageContainer.prepend(nextIm);
        nextIm.attr('src', '');
        
        nextIm.load(function(e) {
            $(this).css('visibility', 'visible');     
            $('.loader-layer').css('display', 'none');
            if(first) {
                if(numItems > 1) {
                    $('div', navArrows).css('visibility', 'visible');
                }
                imageContainer.fadeIn(1000);
            } else {
                var dimCur = ImageResizer.getResizedDim(curIm);
            }


            $(this).removeAttr("width").removeAttr("height").css({ width: "", height: "" }).attr('style', '');
            var dim = ImageResizer.getResizedDim($(this));
            $(this).css({width:dim.width, height:dim.height, top:dim.top});
            
            if(App.isIE == true) {
                $(this).hide();
                $(this).fadeIn(1000);
                $('div', navArrows).css('visibility', 'visible');
                if(!first) {
                    curIm.fadeOut(1000);
                    setTimeout(function() {curIm.remove();}, 1000);
                }
            } else {
                if(slideDirection == 'right') {
                    $(this).css('left', 0 - $(this).width());
                    animationInProgress = true;
                    curIm.animate({left:curIm.position().left+$(this).width()}, 1000, "swing", function() {
                        onSlideCompleted();
                    });
                } else if(slideDirection == 'left') {
                    $(this).css('left', dim.left + $(this).width());
                    animationInProgress = true;
                    curIm.animate({left:dimCur.left-dimCur.width}, 1000, "swing", function() {
                        onSlideCompleted();
                    });
                    
                }

                $(this).animate({left:dim.left}, 1000);
            }
            slideDirection = null;

            if(first == false) {
                at.animate({opacity:0}, 500, function() {
                    textContainer.removeChildAt(0);
                });
                textLayer.delay(500).animate({opacity:1});
            } else {
                textLayer.animate({opacity:1});
            }

            $("a[rel^='lightbox']", textLayer).slimbox({/* Put custom options here */}, null, function(el) {
              return (this == el) || ((this.rel.length > 8) && (this.rel == el.rel));
            });

            // Initial-Bild erkennen
            if(first == true) {
                first = false;
            }

            if(first == false && imageContainer.children().size() >= 3) {
                //imageContainer.removeChildAt(0);
            }

            currentImage = $(this);
            replaceFonts();
        }).attr('src', item.attr('backgroundImage'));

        if(item.attr('textImage')) {
            $(nt).load(function() {
                textLayer.append($(this));
                $(this).removeAttr("width").removeAttr("height").css({ width: "", height: "" });
                textLayer.css(item.attr('textPosition'));
                textLayer.css('opacity', 0);


                if(item.type == 'person' && (item.attr('mailAddress') || item.attr('vCard'))) {
                    var utilsContainer = $('<div/>').addClass('utilities');
                    var mailButton = $('<a/>').addClass('bt-mail').attr('href', 'mailto:' + item.attr('mailAddress'));
                    var vCardButton = $('<a/>').addClass('bt-vcard').attr('href', item.attr('vCard'));
                    if(item.mailAddress) {
                        utilsContainer.append(mailButton);
                        utilsContainer.append('&nbsp;');
                    }
                    utilsContainer.css(item.attr('utilitiesPosition'));
                    utilsContainer.append(vCardButton);
                    textLayer.append(utilsContainer);

                } else if(item.type == 'project') {
                    textLayer.css('cursor', 'pointer');
                    textLayer.click(function() {                     
                        App.navigateToURL(ItemScroller.items.selected.url + '?find=all');
                    });
                }
                
            }).error(function() {
                
            }).attr('src', item.attr('textImage'));
        } else if(item.content) {
            textLayer.css('opacity', 0);
            /*if(first == false) {
                at.animate({opacity:0}, 500, function() {
                    textContainer.removeChildAt(0);
                });
                textLayer.delay(500).animate({opacity:1});
            } else {
                textLayer.animate({opacity:1});
            }*/
            textLayer.css(item.attr('textPosition'));
            textLayer.append(item.content);
            if(item.type == 'person' && (item.attr('mailAddress') || item.attr('vCard'))) {
                var utilsContainer = $('<div/>').addClass('utilities');
                
                var mailButton = $('<a/>').addClass('bt-mail').attr('href', 'mailto:' + item.attr('mailAddress'));
                mailButton.tooltip('send email');
                var vCardButton = $('<a/>').addClass('bt-vcard').attr('href', item.attr('vCard'));
                vCardButton.tooltip('download .vcf');
                if(item.attr('mailAddress')) {
                    utilsContainer.append(mailButton);
                    if(item.attr('vCard')) {
                        utilsContainer.append('&nbsp;');
                    }
                }
                utilsContainer.css(item.attr('utilitiesPosition'));
                if(item.attr('vCard')) {
                    utilsContainer.append(vCardButton);
                }
                textLayer.append(utilsContainer);
                
            } else if(item.type == 'project') {
                textLayer.css('cursor', 'pointer');
                textLayer.click(function() {
                    App.navigateToURL(ItemScroller.items.selected.url + '?find=all');
                });
            }

        } else {
            if(first == false) {
                at.animate({opacity:0}, 500, function() {
                    textContainer.removeChildAt(0);
                });
            }
        }
        

        // Menüpunkt selektieren
        $('a', menu).eq(index).addClass('selected');

        // Navigationspfeile aktualisieren
        $('.arrow-left', navArrows).tooltip("previous | " + this.items.getPrevious().label);
        $('.arrow-right', navArrows).tooltip("next | " + this.items.getNext().label);

        var shadeArea = $('.shade-over', textLayer);

        shadeArea.hover(function(e) {
          var browser = $.browser;

          if(browser.msie && browser.version < 9) {
            $('#background-overlay').css('display', 'block');
          } else {
            $('#background-overlay').css({display:'block'});
            $('#background-overlay').hoverFlow(e.type, {opacity:0.8}, 300);
          }
        }, function(e) {
          var browser = $.browser;

          if(browser.msie && browser.version < 9) {
            $('#background-overlay').css('display', 'none');
          } else {
            $('#background-overlay').hoverFlow(e.type, {opacity:0}, 300);
          }
        });
    }

    /**
     * Private Methoden
     *
     */
    function onSlideCompleted() {
        animationInProgress = false;
        imageContainer.removeChildAt(1);
        $('div', navArrows).css('visibility', 'visible');
    }

    function onImageLoaded() {
        
    }

   /* function getCurrentImage() {
        return $('img:eq(0)', imageContainer);
    }*/
    
    return core;
})();
