/** * csflow - flow elements * * Dependencies: MooTools 1.2 * * @version 0.0.1 * * @license MIT-style license * @author John Gibbon * @copyright Author * @docmentation none, sorry */ var Moebius = new Class({//abstract "array carousel" Implements:[Options], options:{ arr:[1,2,3,4,5,6,7,8,9,10],//put anything in there... visible:5, offset:0 }, initialize:function(options){ this.setOptions(options); if(!this.options.arr){ return; } }, get:function(offset){ var count = this.options.arr.length; var nudata = []; var i = 0; if(offset !== false){ this.options.offset = offset; }else { offset = this.options.offset; } while(i < this.options.visible){ var aindex = (offset+i)%count; var step = 0; while(!this.options.arr[aindex] && (step < 50)){ step++; aindex = (offset+i)%count + count; } nudata.push(this.options.arr[aindex]); i++; } //return others to be, for example, faded out... var others = []; while(i < this.options.arr.length){ //others.push(this.options.arr[i]); i++; } return [nudata,others]; }, next:function(){ return this.get(this.options.offset + 1); }, prev:function(){ return this.get(this.options.offset - 1); } }); var CSFlow = new Class({ Implements: [Options, Events], options:{ container:$empty, elements:$empty, activeElement:'center',// or number maxVisible:5, useWheel:true, useClick:false, verticalCenter:false }, initialize: function(options){ this.setOptions(options); if(!this.options.container){ return; } var m = this.options.container.getChildren(); if(this.options.elements !== $empty) m = this.options.elements; this.moeb = new Moebius({visible:(this.options.maxVisible>m.length?this.options.maxVisible:m.length), arr:m}); if(this.options.useWheel){ this.options.container.addEvent('mousewheel', function(ev){ ev.stop(); if(ev.wheel < 0){ this.next(); return; } this.prev(); }.bind(this)); } var n = this.moeb.options.arr.length; if(this.options.activeElement == 'center'){ this.options.activeElement = (n-1) / 2; } if(this.options.useClick){ var inst = this; m.each(function(el, i){ el.store('flownum', i).addEvent('click', function(){ inst.els = inst.moeb.get(inst.moeb.options.offset - this.retrieve('d')); inst.view(inst.els); }); }); } this.els = this.moeb.get(false); this.viewoffset = 0; this.setupElements(); this.renderElements(); }, setupElements:function(){ //var c = this.options.container; var els = this.moeb.options.arr; //c.setStyles({}); $$(els).setStyles({display:'block', position:'absolute'}); }, view:function(num){ if(!num){ this.els = this.moeb.get(false); } this.renderElements(true); }, prev:function(){ this.els = this.moeb.next(); this.view(this.els); }, next:function(){ this.els = this.moeb.prev(); this.view(this.els); }, renderElements:function(animated){ var els = this.els[0]; var others = this.els[1]; var s = this.options.container.getSize(); var act = this.options.activeElement; var max = this.options.maxVisible + 2; //var distances = ''; var even = els.length % 2; var inst = this; els.each(function(e, i){ var d = (act - i); while(d > max / 2){ d -= max; } while(d < (max*-1/2)){ d +=max; } e.store('d', d); var dist = Math.abs(d); //distances += ' '+d; var fs = 1-(dist*2/max);//(1-(0.35*dist)); //alert(fs); //return; var opacity = 1 - (2*dist/10); var threshold = parseInt(max/2); if(even){ threshold = max/2 - 0.5; //anpassen } var left = (50 - d*20); if(dist == 1){ fs = 1-(dist*2.5/max); }else if(dist == 2){ left = (50 - d*18.5); } e.fireEvent('flow', { 'z-index': 10 - dist, 'font-size': fs+'em', 'opacity': opacity, 'left': left + '%' }) if(dist >= threshold){ opacity = 0; } if(animated){ var morphval = { 'font-size': fs+'em', 'opacity': opacity }; if(inst.options.verticalCenter){ morphval.top = (5 - fs*5); morphval.opacity = 1; } e.setStyles({ 'z-index': 10 - dist }) .set('morph', {unit:'em'}).morph(morphval) .set('tween', {unit:'%'}) .tween('left', left + '%'); } else { var setval = { 'z-index': 10 - dist, 'font-size': fs+'em', 'opacity': opacity, 'left': left + '%' } if(inst.options.verticalCenter){ setval.top = (5 - fs*5) + 'em'; setval.opacity = 1; } e.setStyles(setval); } }) others.each(function(e, i){ if(animated){ e.tween('opacity', 0); return; } e.setStyle('opacity', 0); }); } });