(function($){ var layeranimation = function(rootNode) { var self = this; this.scrollTime = 500; this.waitTime = 4000; this.stepWidth = 20; this.nextItemIntverall = 0.7; this.zIndex = 100; this.offsetWidth = 0; this.isPlaying = true; this.itemButtonClicked = false; this.layerPlayingTimeOut = null; this.root = rootNode; rootNode[0].layerAnimation = self; this.layerList = null; this.layer = new Array(); this.currentLayer = 1; this.currentItem = 0; this.isRunning = false; this.run = function(itemNrNew, layerNew) { // Set Current Item var itemNr = self.currentItem; if ( typeof itemNrNew == 'number' ) itemNr = itemNrNew; // Set Current Layer var layerNr = self.currentLayer; if ( typeof layerNew == 'number' ) layerNr = layerNew; // If it does not exist, return if ( !self.layer[layerNr] || !self.layer[layerNr].items[itemNr] ) { self.isRunning = false; return; } self.isRunning = true; // Get the Item var item = self.layer[layerNr].items[itemNr]; if ( itemNr == 0 && self.isPlaying ) { self.setActive(self.layerList.children().get(layerNr), true, false); } // Calc Position + Timeout Step var currentLeft = parseInt(item.elem.css('left')); var timeout = item.currentTime / (currentLeft * item.direction) * self.stepWidth; if ( itemNr == 0 && currentLeft == self.offsetWidth * item.direction ) { var number = layerNr-1 < 0 ? self.layer.length-1 : layerNr-1; self.layer[number].elem.filter(':not(:animated)').css('opacity', 0)/*fadeTo(self.scrollTime, 0, function(){ self.layer[number].elem.css('z-index', self.zIndex); console.log("animation done " + itemNr + " " + number); })*/; } currentLeft -= (self.stepWidth * item.direction); if ( ( currentLeft <= 0 && item.direction > 0 ) || ( currentLeft >= 0 && item.direction < 0 ) ) { currentLeft = 0; } // Set new Position and Timeout item.elem.css('left', currentLeft); if ( itemNr == 0 ) { self.layer[layerNr].elem.css('left', currentLeft); } // Start next Item in Layer after Intervall if ( item.currentTime <= (self.scrollTime * self.nextItemIntverall) ) { window.setTimeout( function() { self.run(itemNr +1, layerNr); }, timeout); // Reset previous if next Layer comes // if ( this.layer.length > 1 && firstStep) // this.resetLayer(layerNr -1 ); self.layer[layerNr].elem.css('z-index', self.zIndex); } item.currentTime -= timeout; // If this is not the current layer, but an intervalled layer, return if ( itemNrNew || layerNew ) { return; } // scrolling done ? if ( itemNr == self.currentItem && (( currentLeft <= 0 && item.direction > 0 ) || ( currentLeft >= 0 && item.direction < 0 )) ) { if ( self.currentItem < self.layer[layerNr].items.length -1 ) { self.currentItem++; } else { if ( self.layer.length > 1 ) self.resetLayer(layerNr -1 ); self.layer[layerNr].elem.css('z-index', self.zIndex); if ( layerNr < self.layer.length-1 ) { self.currentLayer++; } else { self.currentLayer = 0; } self.currentItem = 0; timeout = self.layer[layerNr].waitTime || self.waitTime; $(document).trigger("layeranimation.layerDone", self.layer); if ( ! self.isPlaying || self.layer.length == 1 ) { self.isRunning = false; return; } } } // next run routine; self.layerPlayingTimeOut = window.setTimeout( self.run, timeout); }; this.resetLayer = function(layer, alsoCurrent) { if ( layer < 0 ) { layer = self.layer.length-1; } if ( !self.layer[layer] ) { return; } var currentLayer = alsoCurrent ? ( self.currentLayer-1 < 0 ? self.layer.length-1 : self.currentLayer-1 ) : self.currentLayer; var offset = layer == currentLayer ? 0 : self.offsetWidth; $(self.layer[layer].items).each(function(){ this.elem.css({'left': this.direction * offset}); this.currentTime = self.scrollTime; }); // Special for layer one self.layer[layer].elem.css({ 'z-index': self.zIndex +100, 'left' : self.layer[layer].items[0].direction * offset }).fadeTo(0, 1); }; /* ***************************************************************************** Build Structure ***************************************************************************** */ this.layerStruct = function() { this.items = new Array(); this.elem = null; this.waitTime = self.waitTime; }; this.itemStruct = function() { this.elem = null; this.direction = +1; this.currentTime = 0; this.next = null; }; this.layerClick = function(elem) { this.Toggle = function(e) { this.elem = $(this); if (e.target) this.elem = $(e.target); else if (e.srcElement) this.elem = $(e.srcElement); this.isPlayPause = this.elem.hasClass('play-pause'); this.active = !this.elem.hasClass('active'); this.playPauseToggle = function(e) { if ( this.active ) { // pause playing self.Pause(); self.itemButtonClicked = true; } else { // start playing self.itemButtonClicked = false; self.Resume(); } }; this.layerToggle = function(e) { self.setActive( this.elem, this.active, this.isPlayPause); if ( this.active ) { if ( self.layer.length == 1 ) return; // stop all animation self.Pause(); var resetLayer = self.currentLayer-1; if ( self.isRunning ) { window.clearTimeout(self.layerPlayingTimeOut); self.resetLayer(self.currentLayer); } // self.layer[self.currentLayer].elem.style.zIndex = self.zIndex; // var resetLayer = self.currentLayer-1; if ( resetLayer < 0 ) resetLayer = self.layer.length -1; // reset Layer for position calculation self.currentItem = 0; // get current Position self.currentLayer = this.elem.parent().children().index(this.elem); // Set Playmode to pause self.setActive( this.elem.parent().children().last(), true, true ); // Reset Layers manually to 0px // Set zIndex and reset previous entry self.layer[self.currentLayer].elem.css({'z-index': self.zIndex, 'left':0}); self.layer[self.currentLayer].elem.children().css('left', 0); var timeout = self.layer[self.currentLayer].waitTime; self.resetLayer(self.currentLayer-1); if ( resetLayer != self.currentLayer ) self.resetLayer(resetLayer); // prepare next Layer for animation if ( self.currentLayer < self.layer.length-1 ) { self.currentLayer++; } else { self.currentLayer = 0; } // disable hover re-enable function self.itemButtonClicked = true; window.setTimeout(function() { // start playing self.Resume(); }, timeout); $(document).trigger("layeranimation.layerDone", self.layer); } else { // start playing self.itemButtonClicked = false; self.Resume(); } }; return this.isPlayPause ? this.playPauseToggle() : this.layerToggle(); }; elem.click(this.Toggle); }; this.setActive = function(elem, active, isPlayPause) { elem = $(elem); // Reset "active" on each if ( !isPlayPause ) { elem.parent().children().removeClass('active'); } // set "active" on current if ( active ) { elem.addClass('active'); } else if ( isPlayPause ) { elem.removeClass('active'); } }; // Pause all animation if still playing this.Pause = function() { if ( ! self.isPlaying ) return; if ( self.itemButtonClicked ) return; self.isPlaying = false; if ( !self.isRunning ) window.clearTimeout(self.layerPlayingTimeOut); self.setActive( self.layerList.children().last(), true, true ); }; // resume animation if not playing this.Resume = function() { if ( self.isPlaying ) return; if ( self.itemButtonClicked ) return; if ( self.layer.length == 1 ) return; self.setActive( self.layerList.children().last(), false, true ); self.isPlaying = true; if ( !self.isRunning ) self.layerPlayingTimeOut = window.setTimeout( self.run, 2000); }; this.togglePlayState = function( active ) { if ( active ) { self.itemButtonClicked = false; self.Resume(); } else { self.Pause(); // do not re-enable automatically self.itemButtonClicked = true; } }; this.init = function() { if ( !self.root || (document.documentMode && document.documentMode < 8) || self.root.find('div[type=layer]').length < 1) { return; } self.layerList = $('