var sectionLoaded = [];
var slideLoaded = [];

// keeping central set of classnames and selectors
var WRAPPER =               'fullpage-wrapper';
var WRAPPER_SEL =           '.' + WRAPPER;

// slimscroll
var SCROLLABLE =            'fp-scrollable';
var SCROLLABLE_SEL =        '.' + SCROLLABLE;

// util
var RESPONSIVE =            'fp-responsive';
var NO_TRANSITION =         'fp-notransition';
var DESTROYED =             'fp-destroyed';
var ENABLED =               'fp-enabled';
var VIEWING_PREFIX =        'fp-viewing';
var ACTIVE =                'active';
var ACTIVE_SEL =            '.' + ACTIVE;
var COMPLETELY =            'fp-completely';
var COMPLETELY_SEL =        '.' + COMPLETELY;

// section
var SECTION_DEFAULT_SEL =   '.section';
var SECTION =               'fp-section';
var SECTION_SEL =           '.' + SECTION;
var SECTION_ACTIVE_SEL =    SECTION_SEL + ACTIVE_SEL;
var SECTION_FIRST_SEL =     SECTION_SEL + ':first';
var SECTION_LAST_SEL =      SECTION_SEL + ':last';
var TABLE_CELL =            'fp-tableCell';
var TABLE_CELL_SEL =        '.' + TABLE_CELL;
var AUTO_HEIGHT =           'fp-auto-height';
var AUTO_HEIGHT_SEL =       '.fp-auto-height';
var NORMAL_SCROLL =         'fp-normal-scroll';
var NORMAL_SCROLL_SEL =     '.fp-normal-scroll';

// section nav
var SECTION_NAV =           'fp-nav';
var SECTION_NAV_SEL =       '#' + SECTION_NAV;
var SECTION_NAV_TOOLTIP =   'fp-tooltip';
var SECTION_NAV_TOOLTIP_SEL='.'+SECTION_NAV_TOOLTIP;
var SHOW_ACTIVE_TOOLTIP =   'fp-show-active';

// slide
var SLIDE_DEFAULT_SEL =     '.slide';
var SLIDE =                 'fp-slide';
var SLIDE_SEL =             '.' + SLIDE;
var SLIDE_ACTIVE_SEL =      SLIDE_SEL + ACTIVE_SEL;
var SLIDES_WRAPPER =        'fp-slides';
var SLIDES_WRAPPER_SEL =    '.' + SLIDES_WRAPPER;
var SLIDES_CONTAINER =      'fp-slidesContainer';
var SLIDES_CONTAINER_SEL =  '.' + SLIDES_CONTAINER;
var TABLE =                 'fp-table';

// slide nav
var SLIDES_NAV =            'fp-slidesNav';
var SLIDES_NAV_SEL =        '.' + SLIDES_NAV;
var SLIDES_NAV_LINK_SEL =   SLIDES_NAV_SEL + ' a';
var SLIDES_ARROW =          'fp-controlArrow';
var SLIDES_ARROW_SEL =      '.' + SLIDES_ARROW;
var SLIDES_PREV =           'fp-prev';
var SLIDES_PREV_SEL =       '.' + SLIDES_PREV;
var SLIDES_ARROW_PREV =     SLIDES_ARROW + ' ' + SLIDES_PREV;
var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;
var SLIDES_NEXT =           'fp-next';
var SLIDES_NEXT_SEL =       '.' + SLIDES_NEXT;
var SLIDES_ARROW_NEXT =     SLIDES_ARROW + ' ' + SLIDES_NEXT;
var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL;

var new_fullpage;
var oldConsole = console;

var lazyLoadElements =  `
    <img id="img-src" data-src="https://www.w3schools.com/html/pulpitrock.jpg" />

    <img id="img-srcet" data-srcset="https://www.w3schools.com/html/pulpitrock.jpg 320w, https://www.w3schools.com/html/pulpitrock.jpg 420w" />

    <video width="320" height="240" controls>
        <source class="source-src" data-src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
        <source class="source-src" data-src="https://www.w3schools.com/html/mov_bbb.ogg" type="video/ogg">
        Your browser does not support the video tag.
    </video>

    <video id="source-srcset" width="320" height="240" controls>
        <source class="source-srcset" data-srcset="https://www.w3schools.com/html/mov_bbb.mp4 768w, videos/tablet-video.mp4 1200w">
        <source class="source-srcset" data-srcset="https://www.w3schools.com/html/mov_bbb.mp4 768w, videos/tablet-video.mp4 1200w">
    </video>

    <video id="video-src" data-src="https://www.w3schools.com/html/mov_bbb.ogg" controls>
        Your browser does not support the video tag.
    </video>

    <audio id="audio-src" data-src="https://www.w3schools.com/html/horse.ogg" controls>
        Your browser does not support the audio element.
    </audio>

    <iframe id="iframe-src" data-src="http://google.com"></iframe>

    <picture>
        <source data-srcset="https://www.w3schools.com/html/pulpitrock.jpg?v=1" media="(min-width: 1440px)">
        <source data-srcset="https://www.w3schools.com/html/pulpitrock.jpg?v=2" media="(min-width: 1024px)">
        <img class="background-image background-image-lazy" data-src="https://www.w3schools.com/html/pulpitrock.jpg?v=3">
    </picture>
`;

function areAllLazyLoaded(element){
    var lazyLoadElements = element.find('[data-src], [data-srcset]');
    return !lazyLoadElements.length;
}

function isAnyLazyLoaded(element){
    return element.find('[src], [srcset]').length;
}

function areOthersLazyLoaded(){
    var isAnyOtherLoaded = false;
    $(SECTION_SEL).each(function(){
        var section = $(this);
        var slides = $(this).find(SLIDE_SEL);
        if(slides.length){

            slides.each(function(){
                var slide = $(this);
                if(!section.hasClass(ACTIVE) || section.hasClass(ACTIVE) && !slide.hasClass(ACTIVE)){
                    isAnyOtherLoaded = isAnyOtherLoaded || isAnyLazyLoaded(slide);
                }
            });

        }
        else if(!section.hasClass(ACTIVE)){
            isAnyOtherLoaded = isAnyOtherLoaded || isAnyLazyLoaded(section);
        }
    });
    return isAnyOtherLoaded;
}

//appends lazy elements to all sections and slides
function appendLazyElements(id){
    $(id).find('.section').each(function(index, section){
        var slides = $(section).find('.slide');
        if(slides.length){
            slides.append(lazyLoadElements);
        }
        else{
            $(section).append(lazyLoadElements);
        }
    });
}

var sectionsCallbacks = {
    afterLoad: function(anchorLink, index) {
        sectionLoaded[index - 1] = true;
        afterLoad = `${anchorLink}, ${index}`;
    },
    onLeave: function(index, nextIndex, direction) {
        sectionLoaded[index - 1] = false;
        onLeave = `${index}, ${nextIndex}, ${direction}`;
    },
    afterRender() {
        afterRender = [$(SECTION_ACTIVE_SEL).index(), $(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index()];
    },
    afterResponsive: function(isResponsive){
        afterResponsive = isResponsive;
    },
    afterResize: function(){
        afterResize = true;
    },
    afterReBuild: function(){
        afterReBuild = true;
    }
};


var sectionsCallbacksV3 = {
    afterLoad: function(origin, destination, direction) {
        sectionLoaded[destination.index ] = true;
        afterLoad = {
            origin: origin,
            destination: destination,
            direction: direction
        };
    },
    onLeave: function(origin, destination, direction) {
        sectionLoaded[origin.index] = false;
        console.log(origin);
        console.log(destination);
        onLeave = {
            origin: origin,
            destination: destination,
            direction: direction
        };
        console.log("-------");
    },
    afterRender() {
        afterRender = [$(SECTION_ACTIVE_SEL).index(), $(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index()];
    },
    afterResponsive: function(isResponsive){
        afterResponsive = isResponsive;
    },
    afterResize: function(width, height){
        afterResize = `${width}, ${height}`;
    },
    afterReBuild: function(){
        afterReBuild = true;
    }
};


$('html').click(function(){
    $(window).trigger('pepe');
});

var onSlideLeave = new_fullpage ? {} : ``;
var onLeave = new_fullpage ? {} : ``;
var afterLoad = new_fullpage ? {} : ``;
var afterSlideLoad = new_fullpage ? {} : ``;

var afterResponsive = false;
var afterResize = false;
var afterReBuild = false;
var afterRender = [];
var locationReplace = null;

var slidesCallbacks = {
    afterSlideLoad: function(anchorLink, index, slideAnchor, slideIndex){
        slideLoaded[slideIndex] = true;
        afterSlideLoad = `${anchorLink}, ${index}, ${slideAnchor}, ${slideIndex}`;
    },
    onSlideLeave: function(anchorLink, index, slideIndex, direction, nextSlideIndex){
        slideLoaded[slideIndex] = false;
        onSlideLeave = `${anchorLink}, ${index}, ${slideIndex}, ${direction}, ${nextSlideIndex}`;
    }
};


var slidesCallbacksV3 = {
    afterSlideLoad: function(section, origin, destination, direction){
        slideLoaded[destination.index] = true;
        afterSlideLoad = {
            section: section,
            origin: origin,
            destination: destination,
            direction: direction
        };
    },
    onSlideLeave: function(section, origin, destination, direction){
        slideLoaded[origin.index] = false;
        onSlideLeave = {
            section: section,
            origin: origin,
            destination: destination,
            direction: direction
        };
    }
};

var anchors = { anchors: ['page1', 'page2', 'page3', 'page4']};

var sectionsAndSlidesCallbacks = Object.assign({}, sectionsCallbacks, slidesCallbacks);
var sectionsAndSlidesCallbacksV3 = Object.assign({}, sectionsCallbacksV3, slidesCallbacksV3);

var allBasicOptions =  Object.assign({}, anchors, sectionsCallbacks, slidesCallbacks);
var allBasicOptionsV3 =  Object.assign({}, anchors, sectionsCallbacksV3, slidesCallbacksV3);


function getTransform(translate) {
    var translateRegex = new RegExp('translate3d\\((.*)px,\\s(.*)px,\\s(.*)px\\)');
    var parts = translateRegex.exec(translate);

    parts = parts.map(function(item){
        return item == '-0' ? 0: item;
    });

    return [''+parts[1]+'', ''+parts[2]+'', ''+parts[3]+''];
}

function getTransformFromElement($el) {
    var results = $el.css('-webkit-transform').match(/matrix(?:(3d)\(-{0,1}\d+(?:, -{0,1}\d+)*(?:, (-{0,1}\d+))(?:, (-{0,1}\d+))(?:, (-{0,1}\d+)), -{0,1}\d+\)|\(-{0,1}\d+(?:, -{0,1}\d+)*(?:, (-{0,1}\d+))(?:, (-{0,1}\d+))\))/);

    if(!results) return ["0", "0", "0"];
    if(results[1] == '3d') return results.slice(2,5);

    results.push("0");
    return results.slice(5, 8);
}

function getWindowPosition(){
    return $(window).scrollTop();
}

function getTop(selector){
    return $(selector).css('top');
}

//overwritting the scrollTop function of jQuery to simulate scroll
//when using autoScrolling:false or scrollBar:true
function simulateScroll(scrollValue){
    window.pageYOffset = (function(){
        return scrollValue;
    })();

    trigger(window, 'scroll');
}

function simulateMouseWheel(type){
    var multiplier = type === 'up' ? -1 : 1;

    //moving down with mouse wheel
    var mouseWheel = new Event('wheel', { 'bubbles': true });
    mouseWheel.deltaY = 10 * multiplier;
    document.dispatchEvent(mouseWheel);
}

function simulateKeydown(type){
    var keyCode = type === 'up' ? 38 : 40;

    //moving down with mouse wheel
    var keydownEvent = new Event('keydown', { 'bubbles': true });
    keydownEvent.keyCode = keyCode;
    document.dispatchEvent(keydownEvent);
}

//not used yet
function simulateTouchMove(target, type){
    var pageY = 100, pageX = 100, differenceX = 0, differenceY = 0;

    switch(type){
        case 'down': differenceY = 500; break;
        case 'up': differenceY = -500; break;
        case 'left': differenceX = 500;break;
        case 'right': differenceX = -500; break;
    }

    //touch start
    var touchStartEvent = new Event('touchstart', { 'bubbles': true });
    touchStartEvent.pageX = pageX + differenceX;
    touchStartEvent.pageY = pageY + differenceY;
    target.dispatchEvent(touchStartEvent);

    //moving down with mouse wheel
    var touchMoveEvent = new Event('touchmove', { 'bubbles': true });
    touchMoveEvent.pageX = pageX;
    touchMoveEvent.pageY = pageY;
    target.dispatchEvent(touchMoveEvent);
}


function trigger(el, eventName, data){
    var event;
    data = typeof data === 'undefined' ? {} : data;

    // Native
    if (window.CustomEvent) {
        event = new CustomEvent(eventName, {detail: data});
    }
    else{
        event = document.createEvent('CustomEvent');
        event.initCustomEvent(eventName, true, true, data);
    }

    el.dispatchEvent(event);
}

function destroyTest(){
    //destroying it if it existed
    if(fullpage_api != null){
        fullpage_api.destroy('all');
    }

    else if($.fn.fullpage != null){
        $.fn.fullpage.destroy('all');
    }

    console.warn = oldConsole.warn;
    console.log = oldConsole.log;
    console.error = oldConsole.error;

    //removing the  URL hash
    window.location.hash = '';

    //resetting the loaded sections array flag
    $.each(sectionLoaded, function(index, value) {
        sectionLoaded[index] = false;
    });

    $('.fullpage-layout.active').removeClass('active');

    onSlideLeave = ``;
    onLeave = ``;
    afterLoad = ``;
    afterSlideLoad = ``;
    afterResponsive = false;
    afterResize = false;
    afterReBuild = false;
    afterRender = [];
    locationReplace = null;
}

function setLoadedState(){
    sectionLoaded = [];
    slideLoaded = [];

    // "Loaded" flag for each section to fill "onLoad"
    $('.section:visible').each(function(index) {
        sectionLoaded.push(false);
    });
    $('.slide:visible').each(function(index){
        slideLoaded.push(false);
    });
}

function areOthersLoaded(elements){
    return elements.filter(function(x){
        return x === true;
    }).length;
}

function initFullpage(id, options){
    $(id).addClass('active');
    setLoadedState();
    $(id).fullpage(options);
}

function initFullpageNew(id, options){
    $(id).addClass('active');
    setLoadedState();

    new_fullpage = new fullpage(id, options);
    new_fullpage.test.isTesting = true;
    return new_fullpage;
}

QUnit.module("module", {
    beforeEach: function(assert) {
        console.warn(assert.test.testName);
    },
    afterEach: function(assert) {
        destroyTest();
    }
});