/*! * Ext Core Library 3.0 * http://extjs.com/ * Copyright(c) 2006-2009, Ext JS, LLC. *  * MIT Licensed - http://extjs.com/license/mit.txt */Ext.ns('Ext.ux');Ext.ux.Carousel = Ext.extend(Ext.util.Observable, {    interval: 200,    transitionDuration: 3,    transitionType: 'carousel',    transitionEasing: 'easeOut',    itemSelector: 'img',    activeSlide: 0,    autoPlay: false,    showPlayButton: false,    pauseOnNavigate: false,    wrap: false,    freezeOnHover: false,    navigationOnHover: false,    hideNavigation: false,    width: null,    height: null,    constructor: function(elId, config) {        config = config || {};        Ext.apply(this, config);        Ext.ux.Carousel.superclass.constructor.call(this, config);        this.addEvents(            'beforeprev',            'prev',            'beforenext',            'next',            'change',            'play',            'pause',            'freeze',            'unfreeze'        );        this.el = Ext.get(elId);        this.slides = this.els = [];                if(this.autoPlay || this.showPlayButton) {            this.wrap = true;        };        if(this.autoPlay && typeof config.showPlayButton === 'undefined') {            this.showPlayButton = true;        }        this.initMarkup();        this.initEvents();        if(this.carouselSize > 0) {            this.refresh();        }    },    initMarkup: function() {        var dh = Ext.DomHelper;                this.carouselSize = 0;        var items = this.el.select(this.itemSelector);        this.els.container = dh.append(this.el, {cls: 'ux-carousel-container'}, true);        this.els.slidesWrap = dh.append(this.els.container, {cls: 'ux-carousel-slides-wrap'}, true);        this.els.navigation = dh.append(this.els.container, {cls: 'ux-carousel-nav'}, true).hide();        this.els.caption = dh.append(this.els.navigation, {tag: 'h2', cls: 'ux-carousel-caption'}, true);        this.els.navNext = dh.append(this.els.navigation, {tag: 'a', href: '#', cls: 'ux-carousel-nav-next'}, true);        if(this.showPlayButton) {            this.els.navPlay = dh.append(this.els.navigation, {tag: 'a', href: '#', cls: 'ux-carousel-nav-play'}, true)        }        this.els.navPrev = dh.append(this.els.navigation, {tag: 'a', href: '#', cls: 'ux-carousel-nav-prev'}, true);        // set the dimensions of the container        this.slideWidth = this.width || this.el.getWidth(true);        this.slideHeight = this.height || this.el.getHeight(true);        this.els.container.setStyle({            width: this.slideWidth + 'px',            height: this.slideHeight + 'px'        });        this.els.caption.setWidth((this.slideWidth - (this.els.navNext.getWidth()*2) - (this.showPlayButton ? this.els.navPlay.getWidth() : 0) - 20) + 'px')                items.appendTo(this.els.slidesWrap).each(function(item) {            item = item.wrap({cls: 'ux-carousel-slide'});            this.slides.push(item);            item.setWidth(this.slideWidth + 'px').setHeight(this.slideHeight + 'px');        }, this);        this.carouselSize = this.slides.length;        if(this.navigationOnHover) {            this.els.navigation.setStyle('top', (-1*this.els.navigation.getHeight()) + 'px');        }        this.el.clip();    },    initEvents: function() {        this.els.navPrev.on('click', function(ev) {            ev.preventDefault();            var target = ev.getTarget();            target.blur();                        if(Ext.fly(target).hasClass('ux-carousel-nav-disabled')) return;            this.prev();        }, this);        this.els.navNext.on('click', function(ev) {            ev.preventDefault();            var target = ev.getTarget();            target.blur();            if(Ext.fly(target).hasClass('ux-carousel-nav-disabled')) return;            this.next();        }, this);        if(this.showPlayButton) {            this.els.navPlay.on('click', function(ev){                ev.preventDefault();                ev.getTarget().blur();                if(this.playing) {                    this.pause();                }                else {                    this.play();                }            }, this);        };        if(this.freezeOnHover) {            this.els.container.on('mouseenter', function(){                if(this.playing) {                    this.fireEvent('freeze', this.slides[this.activeSlide]);                    Ext.TaskMgr.stop(this.playTask);                }            }, this);            this.els.container.on('mouseleave', function(){                if(this.playing) {                    this.fireEvent('unfreeze', this.slides[this.activeSlide]);                    Ext.TaskMgr.start(this.playTask);                }            }, this, {buffer: (this.interval/2)*1000});        };        if(this.navigationOnHover) {            this.els.container.on('mouseenter', function(){                if(!this.navigationShown) {                    this.navigationShown = true;                    this.els.navigation.stopFx(false).shift({                        y: this.els.container.getY(),                        duration: this.transitionDuration                    })                }            }, this);            this.els.container.on('mouseleave', function(){                if(this.navigationShown) {                    this.navigationShown = false;                    this.els.navigation.stopFx(false).shift({                        y: this.els.navigation.getHeight() - this.els.container.getY(),                        duration: this.transitionDuration                    })                }            }, this);        }        if(this.interval && this.autoPlay) {            this.play();        };    },    prev: function() {        if (this.fireEvent('beforeprev') === false) {            return;        }        if(this.pauseOnNavigate) {            this.pause();        }        this.setSlide(this.activeSlide - 1);        this.fireEvent('prev', this.activeSlide);                return this;     },        next: function() {        if(this.fireEvent('beforenext') === false) {            return;        }        if(this.pauseOnNavigate) {            this.pause();        }        this.setSlide(this.activeSlide + 1);        this.fireEvent('next', this.activeSlide);                return this;             },    play: function() {        if(!this.playing) {            this.playTask = this.playTask || {                run: function() {                    this.playing = true;                    this.setSlide(this.activeSlide+1);                },                interval: this.interval*1000,                scope: this            };                        this.playTaskBuffer = this.playTaskBuffer || new Ext.util.DelayedTask(function() {                Ext.TaskMgr.start(this.playTask);            }, this);            this.playTaskBuffer.delay(this.interval*1000);            this.playing = true;            if(this.showPlayButton) {                this.els.navPlay.addClass('ux-carousel-playing');            }            this.fireEvent('play');        }                return this;    },    pause: function() {        if(this.playing) {            Ext.TaskMgr.stop(this.playTask);            this.playTaskBuffer.cancel();            this.playing = false;            if(this.showPlayButton) {                this.els.navPlay.removeClass('ux-carousel-playing');            }            this.fireEvent('pause');        }                return this;    },            clear: function() {        this.els.slidesWrap.update('');        this.slides = [];        this.carouselSize = 0;        this.pause();        return this;    },        add: function(el, refresh) {        var item = Ext.fly(el).appendTo(this.els.slidesWrap).wrap({cls: 'ux-carousel-slide'});        item.setWidth(this.slideWidth + 'px').setHeight(this.slideHeight + 'px');        this.slides.push(item);                                if(refresh) {            this.refresh();        }                return this;    },        refresh: function() {        this.carouselSize = this.slides.length;        this.els.slidesWrap.setWidth((this.slideWidth * this.carouselSize) + 'px');        if(this.carouselSize > 0) {            if(!this.hideNavigation) this.els.navigation.show();            this.activeSlide = 0;            this.setSlide(0, true);        }                        return this;            },        setSlide: function(index, initial) {        if(!this.wrap && !this.slides[index]) {            return;        }        else if(this.wrap) {            if(index < 0) {                index = this.carouselSize-1;            }            else if(index > this.carouselSize-1) {                index = 0;            }        }        if(!this.slides[index]) {            return;        }        this.els.caption.update(this.slides[index].child(':first-child', true).title || '');        var offset = index * this.slideWidth;        if (!initial) {            switch (this.transitionType) {                case 'fade':                    this.slides[index].setOpacity(0);                    this.slides[this.activeSlide].stopFx(false).fadeOut({                        duration: this.transitionDuration / 2,                        callback: function(){                            this.els.slidesWrap.setStyle('left', (-1 * offset) + 'px');                            this.slides[this.activeSlide].setOpacity(1);                            this.slides[index].fadeIn({                                duration: this.transitionDuration / 2                            });                        },                        scope: this                    })                    break;                default:                    var xNew = (-1 * offset) + this.els.container.getX();                    this.els.slidesWrap.stopFx(false);                    this.els.slidesWrap.shift({                        duration: this.transitionDuration,                        x: xNew,                        easing: this.transitionEasing                    });                    break;            }        }        else {            this.els.slidesWrap.setStyle('left', '0');        }        this.activeSlide = index;        this.updateNav();        this.fireEvent('change', this.slides[index], index);    },    updateNav: function() {        this.els.navPrev.removeClass('ux-carousel-nav-disabled');        this.els.navNext.removeClass('ux-carousel-nav-disabled');        if(!this.wrap) {            if(this.activeSlide === 0) {                this.els.navPrev.addClass('ux-carousel-nav-disabled');            }            if(this.activeSlide === this.carouselSize-1) {                this.els.navNext.addClass('ux-carousel-nav-disabled');            }        }    }});
