Hi all,

I am new to MooTools I was directed this way for my question.

I love the feel of MooFlow and really want my images in this fashion.
I am trying to merge MooFlow v0.2 with either Milkbox or ANY type of
lightbox.
At the very least,  I would love to make the images clickable so I can
have them navigate to the video.

I have taken screen shots of my videos to make the MooFlow slideshow.
( It would be awesome to make the slideshow with videos and have them
play when they are clicked,
but seems as though MooFlow only works with images)

SOOO I wanted to make the images clickable and have the videos pop up
in the lightbox, or the very least to have them navigate to another
portion of the website so they could watch the video. (Video's are
embedded wvx)

I've made a SAD attempt but cannot get it to work.
I will post the HTML first,  then the Milkbox information below that.

Just an FYI,  I can get the Milkbox to work on images outside of the
MooFlow slideshow, but not on the images in the slideshow.

ALL .js files are originals except MooFlow.js and the only thing I've
changed there is the OnClickView and some "false" statements to "true"


Sorry for the length!









HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"; lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="imagetoolbar" content="no" />
<meta name="author" content="Tobias Wetzel" />
<title>MooFlow v0.2 - Demo</title>
<style>
body{
        background:#111;
        color:#fff;
        font:0.8em "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-
serif;
        font-weight:normal;
        background-color: #FFE5D1;
}
a{color:#ddd;outline:none;text-decoration:none}
a:hover{color:#fff;}
h1{text-align:right;font-size:2em;}
#demo {
        width:500px;
        margin-top: 0;
        margin-right: auto;
        margin-bottom: 0;
        margin-left: auto;
}
body,td,th {
        color: #666666;
}
</style>
<style type="text/css">
    @import url(milkbox/css/milkbox/milkbox.css);
</style>


<script type="text/javascript" src="mootools-beta-1.2b2.js"></script>
<script type="text/javascript" src="MooFlow.js"></script>

<script type="text/javascript" src="milkbox/js/milkbox.js"></script>

<script type="text/javascript">
var myMooFlowPage = {

        start: function(){

                var mf = new MooFlow($('MooFlow'), {
                        stylePath: 'MooFlow.css',
                        useSlider: true,
                        useAutoPlay: false,
                        useCaption: true,
                        useResize: false,
                        useWindowResize: false,
                        useMouseWheel: true,
                        useKeyInput: true,
                        startIndex: 3
                });
        }

};

window.addEvent('domready', myMooFlowPage.start);
</script>
</head>
<body>
<p></p>
<table width="710" height="296" border="0" align="center"
cellpadding="0" cellspacing="0">
  <tr>
    <td height="296" bgcolor="#FCF1CF"><p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>

    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p></td>
  </tr>
</table>
<table width="710" height="110" border="0" align="center"
cellpadding="0" cellspacing="0" bgcolor="#FCF1CF">
  <tr>

    <td width="736"><div id="demo">
      <div id="MooFlow">
        <div>
          <p><a href="images/nbc_news.jpg" rel="milkbox"><img
src="images/nbc_news.jpg" alt="NBC Nightly News Video" width="185"
height="142" title="NBC Nightly News" /></a></p>
        </div>
        <div><img src="img/stimme_von_oben.jpg" alt="Lautsprecherturm"
width="190" height="142"  title="Stimme von oben" /></div>
        <div><img src="img/farbraum.jpg" alt="A deginer must have."
width="191" height="143" title="Farbraum Farbfächer" /></div>
        <div><img src="img/tropfen.jpg" alt="Tropfen" width="191"
height="142" title="Lichtfluß" /></div>
        <div><img src="img/kunst.jpg" alt="...aber ratet mal was das
is.." width="190" height="142" title="Tja, `s is scho arg
verändert..." /></div>

        <div><img src="img/raetsel_1.jpg" alt="Micro" width="192"
height="144" title="Rätsel" /></div>
        <div><img src="img/raetsel_2.jpg" alt="Rutsche?" width="192"
height="144" title="Was ist das?" /></div>
        <div><img src="img/fries.jpg" alt="Mandelbrot?" width="194"
height="145" title="Fries" /></div>
      </div>
    </div></td>
  </tr>
</table>
<p></p>
<p></p>
<p></p>
<p> </p>

</body>
</html>












MooFlow.js V0.2:

/* -----------------------------------------------------------------
Script:
        MooFlow.js v.0.2dev
        2008-04-12

Copyright:
        Copyright (c) 2007 Tobias Wetzel (ToBSn), <http://outcut.de/>

License:
        MIT-style license

ChangeLog:
        Added {
                Reflection via JS
                Load Images via JSON
                Load Images form HTML-Soure with Filter
                onClickView Callback - returns a object obj{'coordinates',
'src','alt','...'} all image attributes and parent a href, rel and
target
        }
        Changed {
                Class Initialization
                Improved Speed-Up
        }
        Fixed {
                Slider inside click
                blocked key input
                set fullscreen / useWindowResize
        }

Probs:
        Safari 1/2 canvas must be added to body before can paint the
reflection :(

Tested:
        Safari 3 / Safari 2(no reflection)
        Firefox
        Opera 9
        IE 6
----------------------------------------------------------------- */
var SliderEx = new Class({
        Extends: Slider,
        set: function(step){
                this.step = step.limit(0, this.options.steps);
                this.fireEvent('onTick', this.toPosition(this.step));
                return this;
    },
        clickedElement: function(event){
                var dir = this.range < 0 ? -1 : 1;
                var position = event.page[this.axis] - 
this.element.getPosition()
[this.axis] - this.half;
                position = position.limit(-this.options.offset, this.full -
this.options.offset);
                this.step = Math.round(this.min + dir * this.toStep(position));
                this.checkStep();
                this.fireEvent('onTick', position);
        }
});

Fx.TweenEx = new Class({
        Extends: Fx.Tween,
        render: function(element, property, value){
                this.fireEvent('onMotionChange', value[0].value);
                element.setStyle(property, this.serve(value, 
this.options.unit));
        }
});

Element.implement({
        reflect: function(arg){
                var i = new Element('img').setProperty('src', arg.src);
                if (Browser.Engine.trident) {
                        i.style.filter = 'flipv 
progid:DXImageTransform.Microsoft.Alpha
(opacity=30, style=1, finishOpacity=0, startx=0, starty=0, finishx=0,
finishy='+arg.height*0.3+')';
                        i.setStyles({'width':'100%', 'height':'100%'});
                        return new Element('div').adopt(i);
                } else {
                        var can = new 
Element('canvas').setProperties({'width':arg.width,
'height':arg.height});
                        if (can.getContext && !Browser.Engine.webkit419 ) {
                                var ctx = can.getContext("2d");
                                ctx.save();
                                ctx.translate(0,arg.height-1);
                                ctx.scale(1,-1);
                                ctx.drawImage(i, 0, 0, arg.width, arg.height);
                                ctx.restore();
                                ctx.globalCompositeOperation = 
"destination-out";
                                ctx.fillStyle = '#000';
                                ctx.fillRect(0, arg.height*0.5, arg.width, 
arg.height);
                                var gra = ctx.createLinearGradient(0, 0, 0, 
arg.height*0.5);
                                gra.addColorStop(1, "rgba(255, 255, 255, 1.0)");
                                gra.addColorStop(0, "rgba(255, 255, 255, 
"+(1-0.3)+")");
                                ctx.fillStyle = gra;
                                ctx.fillRect(0, 0, arg.width, arg.height);
                        }
                        return can;
                }
        }
});

var MooFlow = new Class({

        Implements: [Events, Options],

        options: {
                onStart: Class.empty,
                onComplete: Class.empty,
                onCancel: Class.empty,
                onClickView: function(obj){
                                Milkbox.showThisImage(obj.href, obj.title, 
obj.alt);
                        },
                onAutoPlay: Class.empty,
                onAutoStop: Class.empty,
                reflection: 0.5,
                heightRatio: 0.6,
                startIndex: 0,
                interval: 3000,
                factor: 115,
                bgColor: '#FCF1CF',
                stylePath: 'MooFlow.css',
                useCaption: false,
                useResize: false,
                useSlider: false,
                useWindowResize: false,
                useMouseWheel: false,
                useKeyInput: false,
                useViewer: true,
        },

        initialize: function(element, options){
                this.MooFlow = element;
                this.setOptions(options);
                this.foc = 150;
                this.index = this.options.startIndex;
                this.factor = this.options.factor;
                this.isFull = false;
                this.isAutoPlay = false;
                this.isLoading = false;

                this.MooFlow.addClass('mf').setStyles({
                        'overflow':'hidden',
                        'background-color':this.options.bgColor,
                        'visibility':'hidden',
                        'position':'relative'
                });

                if(!$chk($('mfCSS'))){new Asset.css(this.options.stylePath,
{id:'mfCSS'});}
                if(this.options.useWindowResize){window.addEvent('resize',
this.update.bind(this, true));}
                
if(this.options.useMouseWheel){this.MooFlow.addEvent('mousewheel',
this.wheelTo.bind(this));}
                if(this.options.useKeyInput){document.addEvent('keydown',
this.keyTo.bind(this));}

                this.getElements(this.MooFlow);
        },

        getElements: function(el){
                this.master = {'images':[]};
                var els = el.getChildren();
                if(els.length<=0) return;
                $$(els).each(function(e){
                        var hash = $H(e.getElement('img').getProperties
('src','title','alt','longdesc'));
                        if(e.get('tag') == 'a'){hash.merge(e.getProperties
('href','rel','target'));}
                        hash = hash.getClean();
                        this.master['images'].push(hash);
                }, this);
                this.clearMain();
        },

        loadJSON: function(url){
                if(!url || this.isLoading) return;
                this.isLoading = true;
                new Request.JSON({
                        onComplete: function(data){
                                if($chk(data)){
                                        this.master = data;
                                        this.index = this.options.startIndex;
                                        this.clearMain();
                                }
                        }.bind(this),
                        onFailure: function(){
                                this.isLoading = false;
                                this.fireEvent('onChancel', 'Can not load 
JSON-Data!');
                        }.bind(this)
                }, this).get(url);
        },

        loadHTML: function(url, filter){
                if(!url || !filter || this.isLoading) return;
                this.isLoading = true;
                new Request.HTML({
                        onSuccess: function(tree, els, htm){
                                this.getElements(new Element('div', {html: 
htm}).getChildren
(filter));
                                this.index = this.options.startIndex;
                        }.bind(this),
                        onFailure: function(){
                                this.isLoading = false;
                                this.fireEvent('onChancel', 'Can not load 
Remote Images!');
                        }.bind(this)
                }, this).get(url);
        },

        clearMain: function(){
                if(this.nav){
                        new Fx.Tween(this.nav, 'bottom', {
                                onComplete: function(){
                                        this.nav.dispose();
                                        if(this.cap) this.cap.dispose();
                                        this.MooFlow.empty();
                                        this.createAniObj();
                                }.bind(this)
                        }).start(-50);
                }
                if(this.cap){this.cap.fade(0);}
                if(!this.nav && !this.cap){
                        this.MooFlow.empty();
                        this.createAniObj();
                }
        },

        getMooFlowElements: function(key){
                var els = [];
                this.master.images.each(function(el){
                        els.push(el[key]);
                });
                return els;
        },

        createAniObj: function(){
                this.aniObj = new Element('div').inject(this.MooFlow);
                this.aniFx = new Fx.TweenEx(this.aniObj, 'left', {
                        transition: Fx.Transitions.Expo.easeOut,
                        link: 'cancel',
                        duration: 750,
                        onMotionChange: this.process.bind(this),
                        onStart: this.flowStart.bind(this),
                        onComplete: this.flowComplete.bind(this)
                });
                this.addLoader();
        },

        addLoader: function(){
                this.MooFlow.store('height', this.MooFlow.getSize
().x*this.options.heightRatio);
                this.MooFlow.addClass('load').setStyle('visibility', 'visible');
                new Fx.Tween(this.MooFlow, 'height', {
                        duration: 800,
                        onComplete: this.preloadImg.bind(this)
                }).start(this.MooFlow.retrieve('height'));
        },

        preloadImg: function(){
                this.loader = new Element('div').addClass('loader').inject
(this.MooFlow);
                var imgs = this.getMooFlowElements('src');
                this.loadedImages = new Asset.images(imgs, {
                    onComplete: this.loaded.bind(this),
                        onProgress: this.createMooFlowElement.bind(this)
                });
        },

        createMooFlowElement: function(counter, index){
                var object = this.getCurrent(index);
                object['width'] = this.loadedImages[index].width;
                object['height'] = this.loadedImages[index].height;

                var div = new Element('div').setStyles({
                        'position':'absolute',
                        'display':'none',
                        'height': this.MooFlow.getSize().y
                });
                var con = new Element('div').inject(div);
                var img = new Element('img', {
                        'src': object.src,
                        'styles':{
                                'vertical-align':'bottom',
                                'width':'100%',
                                'height':'50%'
                        }
                }).inject(con);

                var ref = new Element('img').reflect({
                        'src': object.src,
                        'ref': this.options.reflection,
                        'height': object.height,
                        'width': object.width
                
}).inject(con).setStyles({'width':'100%','height':'50%','background-
color': this.options.bgColor});
                div.inject(this.MooFlow);

                img.addEvent('click', this.clickTo.bind(this, index));
                if(!this.options.useViewer) img.addEvent('dblclick',
this.viewCallBack.bind(this, index));

                object['div'] = div;
                object['img'] = img;
                object['con'] = con;

                this.loader.set('html', (counter+1) + ' / ' +
this.loadedImages.length);
        },

        loaded: function(){
                this.iL = this.master.images.length-1;
                new Fx.Tween(this.loader, 'opacity', {
                        duration : 1000,
                        onComplete: this.createUI.bind(this)
                }).start(0);
        },

        createUI: function(){
                this.MooFlow.removeClass('load');
                this.loader.dispose();
                if(this.options.useCaption){
                        this.cap = new 
Element('div').addClass('caption').set('opacity',0);
                        this.MooFlow.adopt(this.cap);
                }

                this.nav = new Element('div').addClass('MooFlowNav').setStyle
('bottom','-50px');
                var autoPlayCon = new Element('div').addClass('autoPlayCon');
                var sliderCon = new Element('div').addClass('sliderCon');
                var resizeCon = new Element('div').addClass('resizeCon');
                if(this.options.useAutoPlay){
                        var play = new 
Element('a').addClass('play').addEvent('click',
this.play.bind(this));
                        var stop = new 
Element('a').addClass('stop').addEvent('click',
this.stop.bind(this));
                        autoPlayCon.adopt(stop, play);
                }
                if(this.options.useSlider){
                        this.sliPrev = new Element('a').addClass('sliderNext');
                        this.sliNext = new Element('a').addClass('sliderPrev');
                        this.slider = new Element('div').addClass('slider');
                        this.knob = new Element('div').addClass('knob');
                        this.knob.adopt(new 
Element('div').addClass('knobleft'));
                        this.slider.adopt(this.knob);
                        sliderCon.adopt(this.sliPrev,this.slider,this.sliNext);
                        this.slider.store('parentWidth', sliderCon.getSize().x-
this.sliPrev.getSize().x-this.sliNext.getSize().x);
                }
                if(this.options.useResize){
                        var resize = new Element('a').addClass('resize');
                        resize.addEvent('click', this.setScreen.bind(this));
                        resizeCon.adopt(resize);
                }
                this.nav.adopt(autoPlayCon,sliderCon,resizeCon);
                this.MooFlow.adopt(this.nav);
                this.showUI();
        },

        showUI: function(){
                if(this.cap) this.cap.fade(1);
                this.nav.tween('bottom', 20);
                this.fireEvent('onStart');
                this.update();
        },

        update: function(e){
                if(e) return;
                this.oW = this.MooFlow.getSize().x;
                this.sz = this.oW * 0.5;
                if(this.options.useSlider){
                        
this.slider.setStyle('width',this.slider.getParent().getSize().x-
this.sliPrev.getSize().x-this.sliNext.getSize().x-1);
                        
this.knob.setStyle('width',(this.slider.getSize().x/this.iL));
                        this.sli = new SliderEx(this.slider, this.knob, {steps:
this.iL}).set(this.index);
                        this.sli.addEvent('onChange', this.glideTo.bind(this));
                        this.sliNext.addEvent('click', this.next.bind(this));
                        this.sliPrev.addEvent('click', this.prev.bind(this));
                }
                this.glideTo(this.index);
                this.isLoading = false;
        },

        setScreen: function(){
                this.isFull = !this.isFull;
                if(this.isFull){
                        this.holder = new 
Element('div').inject(this.MooFlow,'after');
                        this.MooFlow.wraps(new 
Element('div').inject(document.body));
                        this.MooFlow.setStyles({'position':'absolute','z-
index':'100','top':'0','left':'0','width':window.getSize
().x,'height':window.getSize().y});
                        if(this.options.useWindowResize){
                                this._initResize = this.initResize.bind(this);
                                window.addEvent('resize', this._initResize);
                        }
                } else {
                        this.MooFlow.wraps(this.holder);
                        delete this.holder;
                        window.removeEvent('resize', this._initResize);
                        this.MooFlow.setStyles({'position':'relative','z-
index':'','top':'','left':'','width':'','height':this.MooFlow.retrieve
('height')});
                        
this.slider.setStyle('width',this.slider.retrieve('parentWidth'));
                }
                this.update();
        },

        initResize: function(){
                this.MooFlow.setStyles({'width':window.getSize
().x,'height':window.getSize().y});
                this.update();
        },

        getCurrent: function(index){
                return this.master.images[$chk(index) ? index : this.index];
        },

        flowStart: $empty,

        flowComplete: $empty,

        viewCallBack: function(index){
                if(this.index != index) return;
                var el = $H(this.getCurrent());
                var callBackObject = {};
                callBackObject['coords'] = el.img.getCoordinates();
                el.each(function(v, k){
                        if($type(v) == 'number' || $type(v) == 'string') 
callBackObject[k]
= v;
                }, this);
                this.fireEvent('onClickView', callBackObject);
        },
        prev: function(){
                if(this.index > 0) this.clickTo(this.index-1);
        },
        stop: function(){
                $clear(this.autoPlay);
                this.isAutoPlay = false;
                this.fireEvent('onAutoStop');
        },
        play: function(){
                this.autoPlay = this.auto.periodical(this.options.interval, 
this);
                this.isAutoPlay = true;
                this.fireEvent('onAutoPlay');
        },
        auto: function(){
                if(this.index < this.iL)
                this.next();
                else if(this.index == this.iL)
                this.clickTo(0);
        },
        next: function(){
                if(this.index < this.iL) this.clickTo(this.index+1);
        },
        keyTo: function(e){
                e = new Event(e);
                switch (e.code){
                        case 37:
                                e.stop();
                                this.prev();
                                break;
                        case 39:
                                e.stop();
                                this.next();
                }
        },
        wheelTo: function(e){
                e = new Event(e).stop();
                var d = e.wheel;
                if(e.preventDefault) e.preventDefault();
                if(d > 0) this.prev();
                if(d < 0) this.next();
        },
        clickTo: function(index){
                if(this.index == index) return;
                this.aniFx.cancel();
                if(this.sli) this.sli.set(index);
                this.glideTo(index);
        },
        glideTo: function(index){
                this.index = index;
                if(this.cap) this.cap.set('html', this.getCurrent().title);
                this.aniFx.start(index*-this.foc);
        },
        process: function(x){
                var
zI=this.iL,z,W,H,foc=this.foc,f=this.factor,sz=this.sz,oW=this.oW,div;
                with (Math) {
                        this.master.images.each(function(el){
                                div = el.div;
                                if(x>-foc*6 && x<foc*6){
                                        z = sqrt(10000 + x * x) + 100;
                                        H = round((el.height / el.width * f) / 
z * sz);
                                        W = round(el.width * H / el.height);
                                        if(H >= el.width * 0.5) W = round(f / z 
* sz);

                                        el.con.setStyle('height', H*2 + 'px');
                                        div.setStyle('width', W + 'px');
                                        div.setStyle('left', round(((x / z * 
sz) + sz) - (f * 0.5) / z *
sz) + 'px');
                                        div.setStyle('top', round(oW * 0.4 - H) 
+ 'px');
                                        div.setStyle('z-index', x < 0 ? zI++ : 
zI--);
                                        div.setStyle('display', 'block');
                                } else {
                                        div.setStyle('display', 'none');
                                }
                                x += foc;
                        });
                }
        }
});

window.addEvent('domready', function(){
        $$('.MooFlowieze').each(function(mooflow){
                new MooFlow(mooflow);
        });
});


Reply via email to