/**
 * scroll.js
 * 
 * @author Roland Firmont
 * @copyright 2010 by CentralMedia GmbH
*/
 
"use strict";

(function(){
    $.easing.set = function() {
        return 1;
    };
    /*$.event.oldFix = $.event.fix;
    $.event.fix = function(event) {
        if (!event[$.expando]) {
            switch (event.type) {
                case 'touchstart':
                case 'touchmove':
                case 'touchend':
                    var temp = {};
                    for (var n in event) {
                        temp[n] = event[n];
                    }
                    temp.pageX = event.changedTouches[0].pageX;
                    temp.pageY = event.changedTouches[0].pageY;
                    event = temp;
                    break;
            }
        }
        return $.event.oldFix(event);
    };
    $.event.special.touchmove = {
        teardown: function() {
            return navigator.userAgent.indexOf('Android') >= 0;
        }
    };*/
    $.fn.overscroll.constants.captureThreshold = 10;
    /*$.fn.overscroll.oldStop = $.fn.overscroll.stop;
    $.fn.overscroll.stop = function(event) {
        if (event.data.position) {
            var dx = event.data.options.scrollDelta * (event.pageX - event.data.capture.x);
            var dy = event.data.options.scrollDelta * (event.pageY - event.data.capture.y);
            event.data.lastDelta = {
                dx: dx,
                dy: dy
            };
        }
        return $.fn.overscroll.oldStop.call(this, event);
    };*/
})();

(function(w, m, $, s){

    s = $.fn.scrollGallery = function(options) {
        return s.init($(this), options);
    };

    $.extend(s, {

        constants: {
            scrollDuration: 800,
            openedCursor: 'assets/js/CMSlider/opened.cur',
            closedCursor: 'assets/js/CMSlider/closed.cur'
        },

        events: {
            resize: 'resize orientationchange',
            hide: 'click',
            show: 'click'
        },

        createBGLeft: function(data) {
            data.wrapper.show();
            var element = $('<div><div></div></div>').prependTo(data.wrapper)
                .css('position', 'absolute')
                .css('left', 0)
                .css('top', 0)
                .css('z-index', 1000)
                .css('height', data.container.height())
                .addClass('scrollLeft')
                .click(function(event){
					var maxIndex = data.images.length - 1;
                    var index = Math.round(data.container.scrollLeft() / data.options.imgFullWidth) - 1;
					if (index < 0) index = maxIndex;
                    data.container.animate({
                        scrollLeft: index * data.options.imgFullWidth
                    }, {
                        duration: s.constants.scrollDuration,
                        easing: 'cubicEaseOut'
                    });
                });
            element.children()
                .css('opacity', data.options.bgOpacity)
            	.css(data.options.bgImage ? 'backgroundImage' : 'backgroundColor', data.options.bgImage || data.options.bgColor)
				.css('width','100%')
				.css('height','100%');
            data.wrapper.hide();

            return element;
        },

        createBGRight: function(data) {
            data.wrapper.show();
            var element = $('<div><div></div></div>').appendTo(data.wrapper)
                .css('position', 'absolute')
                .css('right', 0)
                .css('top', 0)
                .css('z-index', 1000)
                .css('height', data.container.height())
                .addClass('scrollRight')
                .click(function(event){
					var maxIndex = data.images.length - 1;
                    var index = Math.round(data.container.scrollLeft() / data.options.imgFullWidth) + 1;
					if (index > maxIndex) index = 0;
                    data.container.animate({
                        scrollLeft: index * data.options.imgFullWidth
                    }, {
                        duration: s.constants.scrollDuration,
                        easing: 'cubicEaseOut'
                    });
                });
            element.children()
            	.css('opacity', data.options.bgOpacity)
            	.css(data.options.bgImage ? 'backgroundImage' : 'backgroundColor', data.options.bgImage || data.options.bgColor)
				.css('width','100%')
				.css('height','100%');
            data.wrapper.hide();

            return element;
        },

        hide: function(event) {
            if (!event.data.container.data('dragging')) {
                event.data.scrollLeft = event.data.container.scrollLeft();
                event.data.options.setVisible(false, event.data);
            }
        },

        show: function(event) {
            event.data.options.setVisible(true, event.data);
            event.data.container.scrollLeft(event.data.scrollLeft);
            s.scrollTo(event.data, event.currentTarget);
        },

        scrollTo: function(data, element) {
            var index = data.targets.index($(element));
            data.container.animate({
                scrollLeft: index * data.options.imgFullWidth
            }, {
                duration: s.constants.scrollDuration,
                easing: 'cubicEaseOut'
            });
        },

        init: function(targets, options) {
            var data = {};

            options = $.extend({
                bgColor: '#ffffff',
                bgImage: '',
                bgOpacity: 0,
                container: false,
                images: false,
                imgWidth: 0,
                imgSpacing: 0,
                overscroll: {
                    openedCursor: s.constants.openedCursor,
                    closedCursor: s.constants.closedCursor
                },
                setVisible: s.setVisible,
                wrapper: false
            }, (options || {}));

            if (targets.length < 1) {
                return;
            }

            if (options.imgWidth < 1) {
                options.imgWidth = targets.width();
            }

            options.imgFullWidth = options.imgWidth + options.imgSpacing;

            data.options = options;
            data.targets = targets;
            data.container = options.container;
            data.images = options.images;
            data.wrapper = options.wrapper || data.container;
            
            if ((navigator.userAgent.indexOf('iPhone') > -1) || (navigator.userAgent.indexOf('iPad') > -1) || (navigator.userAgent.indexOf('Android') > -1)) {
                s.resizeIThing({data: data});
                data.wrapper.show();
                var android = navigator.userAgent.indexOf('Android') > -1;
                var myScroll = new iScroll(data.container.get(0), {snap: android, momentum: !android, vScrollbar: false, hScrollbar: false, desktopCompatibility: false});
                data.iScroll = myScroll;
                //data.container.css('webkitTransitionTimingFunction','cubic-bezier(1,1,1,1)');
                data.wrapper.hide();
                targets.bind('click', function(){
                    var index = data.targets.index($(this));
                    var startIndex = -m.round(myScroll.x/data.wrapper.width());
                    data.wrapper.show();
                    w.setTimeout(function() {
                        myScroll.scrollTo(index * data.wrapper.width() * -1, 0, (250 * m.abs(startIndex-index)) + 'ms');
                    }, 500);
                    $(document.body).addClass('iScroll');
					s.resizeIThing({data: data});
                });
                data.images.bind('click', function(){
                    data.wrapper.hide();
                    $(document.body).removeClass('iScroll');
                });
                $(w).bind(s.events.resize, data, s.resizeIThing);
                return;
            }
            
            data.bgLeft = s.createBGLeft(data);
            data.bgRight = s.createBGRight(data);

            $(w).bind(s.events.resize, data, s.resize);
            data.images.bind(s.events.hide, data, s.hide);
            data.container.bind(s.events.hide, data, s.hide);
            
            data.options.overscroll.onDriftEnd = function(event) {
                var scrollLeft = this.scrollLeft();
                if ((scrollLeft % data.options.imgFullWidth) != 0) {
                    var newScrollLeft = m.round(scrollLeft / data.options.imgFullWidth) * data.options.imgFullWidth;
                    /*if (event.lastDelta.dx > 0)
                        newScrollLeft = m.floor(scrollLeft / data.options.imgFullWidth) * data.options.imgFullWidth;
                    else
                        newScrollLeft = m.ceil(scrollLeft / data.options.imgFullWidth) * data.options.imgFullWidth;*/
                    event.target.animate({
                        scrollLeft: newScrollLeft
                    }, {
                        duration: s.constants.scrollDuration,
                        easing: 'cubicEaseOut'
                    });
                }
            };
            
            data.container.overscroll(data.options.overscroll);
            s.resize({data: data});
            targets.bind(s.events.show, data, s.show);
        },

        resize: function(event) {
            var data = event.data;
            var height = data.container.height();
            var width = data.container.width();
            if (data.wrapper.css('display') == 'none') {
                data.wrapper.show();
                width = data.container.width();
                height = data.container.height();
                data.wrapper.hide();
            }
            var marginWidth = (width - data.options.imgWidth) / 2;
            data.images.first().css('marginLeft', marginWidth);
            data.images.last().css('marginRight', marginWidth);
            data.bgLeft.width(marginWidth - data.options.imgSpacing / 2).height(height);
            data.bgRight.width(marginWidth - data.options.imgSpacing / 2).height(height);
        },
        
        resizeIThing: function (event) {
			if (event.data.wrapper.css('display') == 'none')
				return;
		
            //var width = $(w).width();
            var width = w.innerWidth;
			var height = w.innerHeight;
			var zoomx = width/event.data.options.zoomWidth;
			var zoomy = height/event.data.options.zoomHeight;
			var zoom = 1;
			var addY = 0;
			
			if (zoomx < zoom)
				zoom = zoomx;
			if (zoomy < zoom)
				zoom = zoomy;
			
			if (height * zoom > event.data.options.zoomHeight) {
				addY = (height * zoom - event.data.options.zoomHeight) / 2;
			}
			
            event.data.wrapper.width(width).css({left: pageXOffset, top: pageYOffset + addY}).height(height);
            event.data.container.width(width * event.data.targets.length).height(height);
            event.data.images.width(width).height(height);
            event.data.images.children('.image').css('-webkit-background-size', 'contain');
            event.data.images.children('.image').css('zoom', zoom);
			
            //$('.current a').html(w.innerWidth+'x'+w.innerHeight+' '+event.data.zoom+' '+w.innerWidth*event.data.zoom+'x'+w.innerHeight*event.data.zoom+' '+event.data.images.width());
            //$('.current').css({position: 'absolute', left: pageXOffset, top: pageYOffset, width: width, height: '10px', backgroundColor: '#FF0000'});
				
            if (event.data.iScroll)
                event.data.iScroll.refresh();

			//w.scrollTo(0,0);
            //console.log(width);
        },

        setVisible: function (visible, data) {
            if ($.browser.msie) {
                if (visible) {
                    data.wrapper.show().css('opacity', 0);
                }
                data.wrapper.animate({
                    opacity: visible ? '1' : '0'
                }, {
                    duration: 'slow',
                    complete: visible ? function(){} : function() {
                        $(this).hide();
                    }
                });
            }
            else {
                data.wrapper.animate({
                    opacity: visible ? 'show' : 'hide'
                }, {
                    duration: 'slow'
                });
            }
        }
    });

})(window, Math, jQuery);
