window.trackPageviewControler; // Används av trackPageview

(function () {

var DEFAULT_OPTIONS = {
};

var SlideTrack = new Class({
    Implements: [Events, Class.Occlude],
    
    property: 'trackviewer',
    
    initialize: function (element, object_uri, options) {
        this.element = element;
        
        if (this.occlude()) {
            return this.occluded.occludedInitialize(object_uri, options);
        }
        
        this._onScrollEnd = function (source_element) {
            this.onScrollEnd.bind(this, source_element)();
        }.bind(this);
        this.element.getElement('.slidetrack_swipe_pane').retrieve('iscroll').addEvent('scrollend', this._onScrollEnd);
        
        this._onKeyDown = function (event) {
            this.onKeydown.bind(this, event)();
        }.bind(this);
        document.body.removeEvents('keydown'); // Refakturera så att eventet tas bort när elementet tas bort, nu tas alla keydown event bort.
        document.body.addEvent('keydown', this._onKeyDown);
        
        this._onWindowResize = function (event) {
            this.onWindowResize.bind(this, event)();
        }.bind(this);
        window.addEvent('resize', this._onWindowResize);
        
        return this.occludedInitialize(object_uri, options);
    },
    
    occludedInitialize: function (object_uri, options) {
        var thumbbar, thumbbar_viewport, thumbbar_content_pane, thumbbar_iscroll;
        
        this.options = Object.clone(DEFAULT_OPTIONS);

        if (options) {
            Object.append(this.options, options);
        }
        
        this.object_uri = object_uri;
        
        this.current_page_index = 0;
        this.element.getElements('.thumbnail_container')[this.current_page_index].addClass('current');
        
        thumbbar              = this.element.getElement('.slidetrack_thumbbar');
        thumbbar_content_pane = this.element.getElement('.slidetrack_thumbbar .iscroll_content');
        thumbbar_iscroll      = thumbbar_content_pane.retrieve('iscroll');
        
        if (thumbbar_iscroll.iscroll) {
            if (thumbbar.getSize().x > thumbbar_content_pane.getSize().x) {
                thumbbar.centerOnElement(thumbbar_content_pane);
            }
        }
        else {
            thumbbar.centerOnElement(thumbbar.getElements('.slidetrack_thumbnail')[0].getParent().getParent(), {
                cross_boundaries  : true,
                scroll_vertically : false
            });
            
            thumbbar.getElements('.slidetrack_thumbnail')[0].getParent().getParent().addClass('current');
        }
        
        this.element.getElements('.slidetrackpage')[this.current_page_index].getElements('.multisizeimage').each(function (multisizeimage_element) {
            var multisizeimage = multisizeimage_element.retrieve('multisizeimage');
            
            if (multisizeimage) {
                multisizeimage.displayFull();
            }
        }.bind(this));
        
        return this;
    },
    
    onKeydown: function (event) {
        if (event.key === 'left') {
            this.previousPage();
        }
        else if (event.key === 'right') {
            this.nextPage();
        }
    },
    
    onWindowResize: function (event) {
        if (this.element.getParents('body').length === 0) {
            window.removeEvent('resize', this._onWindowResize);
            return;
        }
        
        if (this.element.getParents('.fillout_group_horizontal,.fillout_group_vertical').length === 0) {
            this.updateChildrenSizes();
        }
    },
    
    updateSize: function () {
        var swipe_viewport, swipe_content_pane, swipe_iscroll, thumbbar_viewport, thumbbar_content_pane, thumbbar_iscroll, current_page, current_page_thumbnail;
        
        if (!this.element.getParent()) {
            window.removeEvent('resize', this._onWindowResize);
            return;
        }
        
        swipe_content_pane = this.element.getElement('.slidetrack_swipe_pane');
        swipe_viewport     = swipe_content_pane.getParent();
        swipe_pane_iscroll = swipe_content_pane.retrieve('iscroll');
        current_page       = swipe_content_pane.getElements('.slidetrackpage')[this.current_page_index];
        
        thumbbar_viewport      = this.element.getElement('.slidetrack_thumbbar');
        thumbbar_content_pane  = this.element.getElement('.slidetrack_thumbbar .iscroll_content');
        thumbbar_iscroll       = thumbbar_content_pane.retrieve('iscroll');
        current_page_thumbnail = thumbbar_content_pane.getChildren('.thumbnail_container')[this.current_page_index];
        
        if (thumbbar_iscroll.iscroll) {
            swipe_pane_iscroll.refresh();
            thumbbar_iscroll.refresh();
            
            swipe_pane_iscroll.scrollToPage(this.current_page_index, 0, '0ms');
            
            thumbbar_viewport.centerOnElement(current_page_thumbnail);
            
            this.element.getElements('.thumbnail_container.current').removeClass('current');
            this.element.getElements('.thumbnail_container')[this.current_page_index].addClass('current');
        }
        else {
            thumbbar_viewport.centerOnElement(thumbbar_content_pane.getChildren('.thumbnail_container')[this.current_page_index], {
                cross_boundaries  : true,
                scroll_vertically : false
            });
            
            //this.element.getParent().retrieve('filloutgroup').updateChildrenSizes(function () {
            //    swipe_viewport.centerOnElement(swipe_content_pane.getChildren('.slidetrackpage')[this.current_page_index], {
            //        cross_boundaries  : true,
            //        scroll_vertically : false
            //    });
            //}.bind(this));
        }
    },
    
    previousPage: function () {
        if (this.current_page_index > 0) {
            this.thumbnailClicked(this.current_page_index - 1);
        }
    },
    
    onScrollEnd: function (source_element) {
        var swipe_pane_iscroll, thumbbar_iscroll, viewport, content_pane, element, left;
        
        if (source_element === this.element.getElement('.slidetrack_swipe_pane')) {
            swipe_pane_iscroll = this.element.getElement('.slidetrack_swipe_pane').retrieve('iscroll');
            
            this.current_page_index = swipe_pane_iscroll.iscroll.pageX;
            
            this.trackPageview(this.current_page_index);
            window.destroy_all_StickyWinInstance();
            
            this.element.getElements('.thumbnail_container.current').removeClass('current');
            this.element.getElements('.thumbnail_container')[this.current_page_index].addClass('current');

            viewport = this.element.getElement('.slidetrack_thumbbar');
            content_pane = this.element.getElement('.slidetrack_thumbbar .iscroll_content');
            thumbbar_iscroll = content_pane.retrieve('iscroll');
            element = this.element.getElement('.thumbnail_container.current');
            
            if (viewport.getSize().x < content_pane.getSize().x) {
                left = content_pane.getPosition(viewport).x;
                
                if (left + element.getPosition(content_pane).x < 0) {
                    left = -element.getPosition(content_pane).x
                }
                if (left + element.getPosition(content_pane).x + element.getSize().x > viewport.getSize().x) {
                    left = viewport.getSize().x - element.getPosition(content_pane).x - element.getSize().x;
                }
                
                if (left !== content_pane.getPosition(viewport).x) {
                    thumbbar_iscroll.scrollTo(left, element.getPosition(content_pane).y, '300ms');
                }
            }
            else {
                viewport.centerOnElement(content_pane);
            }
            
            this.element.getElements('.slidetrackpage')[this.current_page_index].getElements('.multisizeimage').each(function (multisizeimage_element) {
                var multisizeimage = multisizeimage_element.retrieve('multisizeimage');
                
                if (multisizeimage) {
                    multisizeimage.displayFull();
                }
            }.bind(this));
            
            setShareUrl();
        }
    },
    
    nextPage: function () {
        if (this.current_page_index < this.element.getElement('.slidetrack_thumbbar').getElements('.slidetrack_thumbnail').length - 1) {
            this.thumbnailClicked(this.current_page_index + 1);
        }
    },
    
    // Skickar en pageview signal till GA
    // @slide_index är index för vilken slide som ska trackas, räknar första sliden som 0
    trackPageview: function (slide_index) {
        var trackUrl;
        if($$('.slidetrack_swipe_pane .slidetrackpage')[slide_index]){
            trackUrl = $$('.slidetrack_swipe_pane .slidetrackpage')[slide_index].getProperty('track_url');
            if (trackUrl){
                // Koll för att undvika att samma slide trackas flera ggr i rad,
                // t.ex. när man swipear sista sliden och inte kommer vidare till nästa slide.
                if (window.trackPageviewControler !== slide_index){
                    window.trackPageviewControler = slide_index;
                    
                    pageTracker._trackPageview(trackUrl);
                }
            }
        }
    },
    
    thumbnailClicked: function (thumbnail_index) {
        var thumbbar, thumbbar_content_pane, page_viewport;
        
        thumbbar              = this.element.getElement('.slidetrack_thumbbar');
        thumbbar_content_pane = this.element.getElement('.slidetrack_thumbbar .iscroll_content');
        thumbbar_iscroll      = thumbbar_content_pane.retrieve('iscroll');
        page_viewport         = this.element.getElement('.slidetrack_page_viewport');
        
        this.trackPageview(thumbnail_index);
        window.destroy_all_StickyWinInstance();
        
        thumbbar.getElements('.slidetrack_thumbnail')[this.current_page_index].getParent().getParent().removeClass('current');
        
        if (thumbbar_iscroll.iscroll) {
            page_viewport.getChildren()[0].retrieve('iscroll').scrollToPage(thumbnail_index, 0, '300ms');
        }
        else {
            thumbbar.centerOnElement(thumbbar.getElements('.slidetrack_thumbnail')[thumbnail_index].getParent().getParent(), {
                fx_options        : {},
                cross_boundaries  : true,
                scroll_vertically : false
            });
            page_viewport.centerOnElement(page_viewport.getElements('.slidetrackpage')[thumbnail_index], {
                fx_options        : {},
                cross_boundaries  : true,
                scroll_vertically : false
            });
        }
        
        this.current_page_index = thumbnail_index;
        
        page_viewport.getElements('.slidetrackpage')[this.current_page_index].getElements('.multisizeimage').each(function (multisizeimage_element) {
            var multisizeimage = multisizeimage_element.retrieve('multisizeimage');
            multisizeimage.displayFull();
        }.bind(this));
        
        this.element.getElements('.thumbnail_container.current').removeClass('current');
        this.element.getElements('.thumbnail_container')[this.current_page_index].addClass('current');
        var tempSeoUrl = this.element.getElements('.thumbnail_container.current').getElements('a')[0].get('seourl')
        if (tempSeoUrl[0]){
            window.location.hash = '!'+tempSeoUrl[0].split('?!')[1];
            $('pvms_history_check_id').store('history',window.location.hash);
        }
        
        this.setNavigateBarButtonUrl(thumbnail_index);
        
        setShareUrl();
    },
    
    // Sätter rätt url på höger -vänsterknappar i gallerinavigering
    setNavigateBarButtonUrl: function (thumbnail_index) {
        var leftButton, rightButton, currentIndex, totalNoOfSlides, nextIndex, prevIndex;
        
        leftButton = $$('.slidetrack_page_viewport .navigate_bar.left');
        rightButton = $$('.slidetrack_page_viewport .navigate_bar.right');
        
        if (leftButton.length > 0 && rightButton.length > 0){
            totalNoOfSlides = $$('.thumbnail_container a').length -1;

            currentIndex = thumbnail_index;
            
            if (currentIndex === totalNoOfSlides){
                nextIndex = 0;
            }
            else{
                nextIndex = currentIndex + 1;
            }
            
            if (currentIndex === 0){
                prevIndex = totalNoOfSlides;
            }
            else{
                prevIndex = currentIndex - 1;
            }
            
            rightButton.setProperty('href', $$('.thumbnail_container a')[nextIndex].getProperty('href'));
            leftButton.setProperty('href', $$('.thumbnail_container a')[prevIndex].getProperty('href'));
        }
    },


    thumbnailClickednoEffects: function (thumbnail_index) {
        var thumbbar, thumbbar_content_pane, page_viewport;
        
        thumbbar              = this.element.getElement('.slidetrack_thumbbar');
        thumbbar_content_pane = this.element.getElement('.slidetrack_thumbbar .iscroll_content');
        thumbbar_iscroll      = thumbbar_content_pane.retrieve('iscroll');
        page_viewport         = this.element.getElement('.slidetrack_page_viewport');
        
        thumbbar.getElements('.slidetrack_thumbnail')[this.current_page_index].getParent().getParent().removeClass('current');

        if (thumbbar_iscroll.iscroll) {
            
        }
        else {
            thumbbar.centerOnElement(thumbbar.getElements('.slidetrack_thumbnail')[thumbnail_index].getParent().getParent(), {});
            page_viewport.centerOnElement(page_viewport.getElements('.slidetrackpage')[thumbnail_index], {});
        }
        
        this.current_page_index = thumbnail_index;
        
        page_viewport.getElements('.slidetrackpage')[this.current_page_index].getElements('.multisizeimage').each(function (multisizeimage_element) {
            var multisizeimage = multisizeimage_element.retrieve('multisizeimage');
            multisizeimage.displayFull();
        }.bind(this));
        
        this.element.getElements('.thumbnail_container.current').removeClass('current');
        this.element.getElements('.thumbnail_container')[this.current_page_index].addClass('current');
        
        this.setNavigateBarButtonUrl(thumbnail_index);
        setShareUrl();
    }
});

function activate_slidetracks(element) {
    element.getElements('.slidetrack').each(function (slidetrack_element) {
        new SlideTrack(slidetrack_element, slidetrack_element.get('object_uri'));
    });
}
window.element_activators.push(activate_slidetracks);

})();

