/**
SCM EasyCoverflow
@author Leon Dietsch <dietsch@icmedienhaus.de>
@description jQuery Coverflow Plugin - enables you to create a coverflow
*/
(function( $ ){	

	var self;
	var covers;
	var numCover;
	var centerPos;
	var settings;
	var selectedCover = 0;
	
	var coverScrollSteps;
	var mouseScrollPosition = 1;
	
	var methods = {
		
		// ------------------------------------------------------------------------------------------
		init : function( options ) { 
		   	
			settings = $.extend( {
				'coverHeight' : false,
				'coverWidth' : false,
				'coverMargin': 75,
				'fadeOutOpacity': '0.2',
				'shrinkValue': 8,
				'selectCoverCallback': function(){}
			}, options);
		
			return this.each(function() {
				
				self = $(this);
				
				covers = self.find('a');
				
				// set all covers to absolute
				covers.css({'position':'absolute'}); 
				
				// we expect the parent element to have a fixed width and overflow:hidden
				self.width(1000).css({
					'position':'relative'
				});
				
				// set sizes of the covers
				if(settings.coverHeight === false) {
					settings.coverHeight = covers.children('img').eq(0).height();
				}else{
					covers.children('img').height(settings.coverHeight);
				}
				
				if(settings.coverWidth === false) {
					settings.coverWidth = covers.children('img').eq(0).width();
				}else{
					covers.children('img').width(settings.coverWidth);
				}
				
				// replace covers with canvas
				//reflection = $("<canvas />")[0];
				
				
				covers.each(function(iteration){
					
					$(this).click(function(event){
						methods.selectCover(iteration+1);
						event.preventDefault();
					});	
					
				});
				
				// calculate center position
				centerPos = methods.calcCenter();
				
				// count covers		
				numCover = covers.size(); 
				
				
				// set the first cover as the selected
				methods.selectCover(1);
				
				//self.parent().mousewheel(methods.mouseScroll);
				
			});
		
		},
		// ------------------------------------------------------------------------------------------
			selectCover : function(selectedPos) {

				var zIndex = 10*numCover;
				var positionShift = settings.coverWidth / 2;
				
				var coverRatio = settings.coverHeight/settings.coverWidth;

				// wir durchlaufen alle bilder und geben ordnen sie um 
				// das selektierte cover an
				for(pos = 1;pos <= numCover;pos++) {
					
					coverPosition = pos - selectedPos;
					
					zoomWidth = settings.coverWidth - (Math.abs(coverPosition) * settings.shrinkValue); // * ¥;
					zoomHeigth = zoomWidth / settings.coverWidth * settings.coverHeight; // * settings.shrinkValue;
					
					correctionLeft = settings.coverWidth - zoomWidth
					correctionTop =  settings.coverHeight - zoomHeigth

					if(pos < selectedPos) {
						
						zIndex +=10;
						
						covers.eq(pos-1).stop()
							.removeClass('posRight')
							.addClass('posLeft')
							.css({'z-index'	: zIndex})
							.animate({
								'left': centerPos + ( coverPosition * positionShift ) + correctionLeft - settings.coverMargin
								//'top': correctionTop
							});
			
					}else if(pos == selectedPos) {
						
						zIndex +=10;
						
						covers.eq(pos-1).stop()
							.removeClass('posLeft')
							.removeClass('posRight')
							.addClass('selected')
							.css({'z-index'	: zIndex})
							.animate({
								'left': centerPos
								//'top': 0
							});
						
						
					}else if(pos > selectedPos) {
						
						zIndex -=10;
						
						 + settings.coverMargin;
						
						covers.eq(pos-1).stop()
							.removeClass('posLeft')
							.addClass('posRight')
							.css({'z-index'	: zIndex})
							.animate({
								'left': centerPos + ( coverPosition * positionShift ) - correctionLeft + settings.coverMargin
								//'top': correctionTop
							});
			
					}
			
				}// for loop
				
				settings.selectCoverCallback(covers.eq(selectedPos-1),covers.eq(selectedCover-1),selectedPos);
				
				selectedCover = selectedPos;
			},
			// ------------------------------------------------------------------------------------------
			calcCenter :  function() {
				return (1000/2)-settings.coverWidth;
			},
			// ------------------------------------------------------------------------------------------
			mouseScroll : function(event, delta) {
				
				// Wir stellen uns eine Linie vor die als abschnitte einzelne Cover hat
				// zu denen wir scrollen wollen
				var scrollLine = numCover*10 - 10;
				
				// So groß ist der Bereich für ein Cover, damit finden wir heraus
				// wann wir zum nächsten cover wechseln
				var scrollSwapLimit = scrollLine/numCover;
				
				// Wir setzten die aktuelle mousescrollposition
				if(delta < 0 && mouseScrollPosition > 1){
					mouseScrollPosition -= 1;
				}else if(delta > 0 && mouseScrollPosition < scrollLine){
					mouseScrollPosition += 1;
				}

				gotoCover = Math.floor(mouseScrollPosition/scrollSwapLimit);
				
				// Debug
				//console.log(gotoCover+' => '+mouseScrollPosition+' / '+scrollLine+' / '+scrollSwapLimit);
				
				if(gotoCover != selectedCover && gotoCover > 0) {
					methods.selectCover(gotoCover);
					//console.log('----SWITCH TO '+gotoCover+'----');
				}

				event.preventDefault();
			}
		};

	
	jQuery.fn.scmEasyCoverflow = function(method) {
		
		if ( methods[method] ) {
	      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
	    } else if ( typeof method === 'object' || ! method ) {
	      return methods.init.apply( this, arguments );
	    } else {
	      $.error( 'Method ' +  method + ' does not exist on jQuery.scmEasyCoverflow' );
	    }   
		
  };
})( jQuery );

