var App = {};

(function($) {
    App.init = function() {

        var app = this;
        var frame = $('#frame');
        var viewport = Modernizr.touch ? frame : $($.browser.mozilla || $.browser.msie ? 'html' : 'body');
        var listener = Modernizr.touch ? viewport : $(window);
        var navigation;
        yepnope({
            test: Modernizr.touch,
            yep: ['js/App.TouchNavigation.js', 'js/libs/iscroll-lite.js'],
            complete: function(url, result, key) {
                if (Modernizr.touch) {
                    new iScroll(viewport.get(0));
                }
            }
        });
		
        var zIndexHandler = new this.ZIndexHandler([$('#forme .bordi'), viewport, $('#text'), $('#logoCont')]);
        var frasi = new this.Frasi(viewport, listener);
        $('#logoCont').css('padding-top', $(window).height() - 140);
        if (!Modernizr.touch) {
            var parallax = new this.Parallax(viewport, listener, $('[data-parallax]'));
            var infiniteScroll = new this.InfiniteScroll(viewport, listener);
        }
    }
})(jQuery);

(function($) {
    var zIndexHandler;
    App.ZIndexHandler = function(elements) {
        zIndexHandler = this;
        this.elements = elements;
        for (var i = 0; i < this.elements.length; i++) {
            var el = this.elements[i];
            el.css({
                zIndex: i,
                position: el.css('position') == 'static' ? 'relative' : el.css('position')
            });
        }
    }
})(jQuery);

(function($) {
    var infiniteScroll;
    App.InfiniteScroll = function(viewport, listener) {
        infiniteScroll = this;
        this.viewport = viewport;
        this.content = viewport.find('#content');
        this.scrollY = 0;

        this.currentPosition = 'top';
        this.widthClass = '';
        listener.scroll(this.onScroll);
        $(window).resize(this.onResize).trigger('resize');
    }

    App.InfiniteScroll.prototype.onResize = function() {
        var size = infiniteScroll.viewport.width() <= 1440 ? 'small' : 'big'
        var height = size == 'small' ? 2629 : 3652;
        infiniteScroll.widthClass = size == 'small' ? 'w1440' : 'w2000';
    }
    App.InfiniteScroll.prototype.onScroll = function() {
        infiniteScroll.checkWrap();
    }

    App.InfiniteScroll.prototype.checkWrap = function() {
        var delta = infiniteScroll.viewport.scrollTop() - infiniteScroll.scrollY;
        var y = infiniteScroll.scrollY = infiniteScroll.viewport.scrollTop();
        if (Math.abs(delta) < 800) {
            if (y < 5 && delta < 0) {
                infiniteScroll.goToBottom();
            }
            if (y > infiniteScroll.content.outerHeight() - $(window).height() - 5 && delta > 0) {
                infiniteScroll.goToTop();
            }
        }
    }
    App.InfiniteScroll.prototype.goToTop = function() {
        infiniteScroll.viewport.scrollTop(5);
    }
    App.InfiniteScroll.prototype.goToBottom = function() {
        infiniteScroll.viewport.scrollTop(infiniteScroll.content.outerHeight() - 5);
    }
})(jQuery);


(function($) {
    var parallax;
    App.Parallax = function(viewport, listener, items) {
        parallax = this;
        this.viewport = viewport;
        this.items = items;
        items.each(function() {
            var item = $(this);
            var itemHeight = item.outerHeight();
            var spacer = $('<div />');
            spacer.css({
                width: item.outerWidth(),
                height: itemHeight,
                marginTop: item.css('margin-top'),
                marginBottom: item.css('margin-bottom')
            });
            spacer.insertAfter(item);
            item.data('y', item.offset().top);
            item.css('position', 'fixed');
        });
        listener.scroll(this.update).trigger('scroll');
    }
    App.Parallax.prototype.update = function() {
        var scroll = parallax.viewport.scrollTop();
        parallax.items.each(function() {
            var item = $(this);
            var parallax = item.data('parallax');
            var y = item.data('y');
            var offset = (y - scroll) * parallax;
            item.css('top', offset);
        });
    }
})(jQuery);


(function($) {
    var frasi;
    var settings = {
        duration: 9000,
        range: 750
    };
    App.Frasi = function(viewport, listener) {
        frasi = this;
        this.interval = null;
        this.index = 0;
        this.container = $('#text .frasi');
        this.viewport = viewport;
        this.items = this.container.find('.frase');
        this.items.not(':first-child').hide();
        this.container.mouseenter(frasi.stopInterval);
        this.container.mouseleave(frasi.startInterval);
        this.startInterval();
        listener.scroll(this.onScroll).trigger('scroll');
    }
    App.Frasi.prototype.startInterval = function() {
        if (frasi.interval !== null) {
            clearInterval(frasi.interval);
            frasi.interval = null;
        }
        frasi.interval = setInterval(frasi.changeStatement, settings.duration)
    }
    App.Frasi.prototype.stopInterval = function() {
        clearInterval(frasi.interval);
    }
    App.Frasi.prototype.changeStatement = function() {
        frasi.index = ++frasi.index % frasi.items.length;
        if (Modernizr.opacity) {
            frasi.items.eq(frasi.index - 1).delay(300).fadeToggle(1100);
            frasi.items.eq(frasi.index).fadeToggle(1300);
        } else {
            frasi.items.eq(frasi.index - 1).slideUp(250, 'easeOutCirc', function() {
            frasi.items.eq(frasi.index).delay(300).slideDown(250, 'easeOutCirc');
            });
        }
    }
    App.Frasi.prototype.onScroll = function() {
        var target = frasi.container.parent();
        var scroll = frasi.viewport.scrollTop();
        var offset = target.data('y') - settings.range;
        var opacity = Math.min(1, Math.max(0.3, (scroll - offset) / ((offset + settings.range) - offset)));
        if (Modernizr.opacity) {
            target.css('opacity', opacity);
        }
    }
})(jQuery);




jQuery(function($){
	App.init();
});
