
/**
 * jQuery-Plugin für die Animation eines Elements vom Bildschirm-Rand zu einem Ziel-Ort. 
 * @author Felix Richter, INblau
 */
jQuery.fn.IbAnimation = function(options) {
	var settings = {
		'target' : jQuery('body'),
		'direction' : 'left',
		'easing' : 'swing',
		'duration': 2000,
		'topOffset' : 0,
		'leftOffset' : 0,
		'rightOffset' : 0
	}
	
	if(options) {
		jQuery.extend(settings, options);
	}
	
	if(settings.direction == 'overlaying') {
		var tpos = {'top': 0, 'left': 0};
	} else {
		var tpos = settings.target.position();
		
	}
	var tpos_hcenter = tpos.top + (settings.target.height() / 2);
	var tpos_wcenter = tpos.left + (settings.target.width() / 2);

	jQuery(this).css('z-index', 999);
	switch(settings.direction) {
		case 'left': 
			jQuery(this).css('position','absolute');
			jQuery(this).css('top', tpos_hcenter - (jQuery(this).height() / 2));
			jQuery(this).css('left', 0 - jQuery(this).width() - settings.leftOffset);
			
			jQuery(this).animate({
				left: tpos.left - 8,
				top: tpos.top -8
			},
			settings.duration,
			settings.easing
			);
			break;
		case 'right': 
			jQuery(this).css('position','absolute');
			jQuery(this).css('top', tpos_hcenter - (jQuery(this).height() / 2));
			//jQuery(this).css('left', 0 - jQuery(this).width() - settings.rightOffset);
			jQuery(this).css('left', jQuery(this).parent().width() );
			//jQuery('body').css('overflow', 'hidden');
			
			jQuery(this).animate({
				left: tpos.left - 8,
				top: tpos.top -8
			},
			settings.duration,
			settings.easing,
			function() {
				jQuery('body').css('overflow', 'auto');	
			}
			);
			
			break;
		case 'top' : 
			jQuery(this).css('position','absolute');
			jQuery(this).css('left', tpos_wcenter - (jQuery(this).width() / 2));
			jQuery(this).css('top', 0 - jQuery(this).height() - settings.topOffset );

			
			jQuery(this).animate({
				left: tpos.left - 8,
				top: tpos.top -8
			},
			settings.duration,
			settings.easing
			);
		
			break;
		
		case 'overlaying' : 
			var children = jQuery(this).children();
			for(var i = children.length - 1; i>= 1; i--) {
				jQuery(children[i]).animate({
					'opacity': 0
				},
				{
					'duration': settings.duration
				});
			}
		default:
				
	}
	return this;
}

/**
 * jQuery-Plugin für die Produkt-Scroller
 */
jQuery.fn.IbProductScroller = function(options) {
	var scrolling = false;
	var settings = {
			'upTrigger' : jQuery('.scroll-down'),
			'downTrigger' : jQuery('.scroll-up'),
			'container': jQuery('.scroll-container'),
			'easing' : 'swing'
	}
	
	if(options) {
		jQuery.extend(settings, options);
	}
	
	settings.upTrigger.mousedown(startScrollingUp);
	settings.upTrigger.mouseup(stopScrolling);
	settings.downTrigger.mousedown(startScrollingDown);
	settings.downTrigger.mouseup(stopScrolling);
	
	settings.container.mousewheel(function(event, delta) {
			if(delta < 0) {				
				scrollUp(true);
			} else {
				scrollDown(true);
			}
	});
	
	function startScrollingUp(e) {
		e.preventDefault();
		scrolling = true;
		scrollUp();
		
	}
	
	function startScrollingDown(e) {
		e.preventDefault();
		scrolling = true;
		scrollDown();
	}
	
	
	function scrollUp(no_delay) {
		var cpos = settings.container.position();
		var step = settings.container.children().first().outerHeight(true);
		if(cpos.top <= (0-(settings.container.height() - settings.container.parent().height()))) {
			return;
		}
		var move =  cpos.top - step;
		if(cpos.top - step < (0 - settings.container.width())) {
			move = 0 - settings.container.width();
		}
		var delay = no_delay ? 0 : 500;
		settings.container.animate({
			top: (cpos.top - step) + 'px'
		},
		delay,
		'linear',
		function() {
			if(scrolling) {
				scrollUp();
			}
			
		}
		);
		
	} 
		
	
	function scrollDown(no_delay) {
		var cpos = settings.container.position();
		var step = settings.container.children().first().outerHeight(true);
		if(cpos.top >= 0) {
			return;
		}
		
		var move =  cpos.top + step;
		if(cpos.top + step > 0) {
			move = 0;
		}
		var delay = no_delay ? 0 : 500;
		settings.container.animate({
			top: move + 'px'
		},
		delay,
		'linear',
		function() {
			if(scrolling) {
				scrollDown();
			}
			
		}
		);
	}
	
	function stopScrolling(e) {
		e.preventDefault();
		scrolling = false;
	}
	
}


var ProductAnimations = {
	current : 0,
	settings : {
		triggerContainer : jQuery('.scroll-container'),
		contentContainer: jQuery('#animation-contents'),
		descriptionContainer: jQuery('.diamond-rating p:first'),
		wall: jQuery('.products-show'),
		relContainer: jQuery('.rating'),
		defaultBackground: 'img/backgrounds/hintergrund.jpg'
	},	
		
	init: function(options) {
		
		if(options) {
			jQuery.extend(this.settings, options);
		}
		this.preloadCopies();
		this.preloadBackgrounds();
		this.setClickHandlers();
	},	
	setClickHandlers: function() {
		this.settings.triggerContainer.children().each(function(idx, item){
			item = jQuery(item);
			item.click(function(e){
				e.preventDefault();
				ProductAnimations.animate(jQuery(this));
			});
		});
		
	},
	animate: function(elm) {
		this.current = elm;
		jQuery('body').clearQueue('ani');
		jQuery('body').clearQueue('fx');
		this.settings.wall.html('');
		var idx = jQuery('.scroll-container').children().index(elm);
		var settings = this.settings;
//		var contents = this.settings.contentContainer.find('#product-'+idx).children();
		var group_container = jQuery(this.settings.contentContainer.find('.product-image').get(idx));
		var contents = group_container.children();
		var group_settings = jQuery.parseJSON(group_container.attr('rel'));
		
		if ( group_settings.background ){
			var background_img = group_settings.background;
		} else {
			var background_img = settings.defaultBackground;
		}
		
		
		this.settings.relContainer.attr('rel', group_settings.product_id);
		this.setDescription(group_container);
		contents.each(function(idx, item) {
			var delay = 0;
			if(idx > 0 && group_settings.delay) {
				delay = group_settings.delay
			}
			//ProductAnimations.animateElement(item);
			jQuery('body').delay(delay,'ani').queue('ani', function() {
				ProductAnimations.animateElement(item); jQuery('body').dequeue('ani');
			});
		})
		//jQuery('<img src="'+background_img+'">').load(function() {
			ProductAnimations.settings.wall.css('background-image', 'url('+background_img+')' );
			
			jQuery('body').dequeue('ani');
		//});
		
	},
	
	animateElement : function(item) {
		item = jQuery(item);
		var settings = this.settings;
		var copy = item.data('copy').clone();
		copy.css('position', 'relative');
		var elm_settings = jQuery.parseJSON(copy.attr('rel'));

		if (elm_settings.direction == 'overlaying') {
			copy.css('position', 'absolute');
		}
		
		settings.wall.append(copy);
		var landing_space = jQuery('<div>')
		.css('top', elm_settings.y + 'px')
		.css('left', elm_settings.x +'px')
		.css('width', copy.width())
		.css('height', copy.height())
		//.css('border', 'solid 1px #f00') // REMOVE
		.css('position', 'absolute');
		if (elm_settings.direction != 'overlaying') {
			settings.wall.append(landing_space);
		}
		
		if (elm_settings.direction == 'overlaying') {
			settings.wall.css('background', 'none');
		}
		
		var wall_offsets = settings.wall.offset();
		
		var animated = copy;
		if (elm_settings.direction == 'overlaying') {
			animated = ProductAnimations.settings.wall;
		}
		
		if (elm_settings.direction == 'overlaying') {
			var duration = 3000;
		}else {
			var duration = 2000;
		}
		animated.IbAnimation({
			'direction' : 'top',
			'target': landing_space,
			'direction' : elm_settings.direction,
//			'topOffset' : wall_offsets.top,
			'topOffset' : 0,
//			'leftOffset' : wall_offsets.left,
			'leftOffset' : 0,
//			'rightOffset' :  Math.ceil((jQuery(document).width() / 2) - (jQuery('.container').outerWidth() / 2) + 70)
			'rightOffset' :  0,
			'duration' : duration
		});
	},
	
	animateFirst: function() {
		this.settings.triggerContainer.children().first().click();
	},
	animateNth: function(n) {
		var elm = this.settings.triggerContainer.children()[n];
		if(elm) {
			jQuery(elm).click();
		}
	},
	setDescription: function (container) {
		var id = container.attr('id').substr(8);
		var content = jQuery('#product-description-'+id).html();
		this.settings.descriptionContainer.html(content);
		Voting.getVote();
	},
	preloadCopies: function() {
		this.settings.contentContainer.find('img').each(function(idx, item) {
			item = jQuery(item);
			var copy = item.clone();
			item.data('copy', copy);
		});
	},
	preloadBackgrounds: function() {
		this.settings.contentContainer.find('div').each(function(idx, item) {
			item = jQuery(item);
			if(item.attr('rel')) {
				var item_settings = jQuery.parseJSON(item.attr('rel'));
				if(item_settings.background) {
					jQuery('<img />').attr('src', item_settings.background);
				}
			}
			
		});
	},
	getCurrent: function() {
		return this.current;
	},
	getCurrentIdx: function() {
		return this.settings.triggerContainer.children().index(this.getCurrent());
	}
} 

var Voting = {
	settings : {
		container: jQuery('.rating')
	},	
	init: function(options) {
		if(options) {
			jQuery.extend(this.settings, options);
		}
		
		
		this.settings.container.children().click(function(e) {
			e.preventDefault();
			Voting.vote(jQuery(this));
		});
			
	},
	getVote: function() {
		jQuery.ajax({
			url: '?action=myvote&product=' + this.settings.container.attr('rel'),
			dataType: 'json',
			success: function(data) {
				if(data.success) {
					Voting.markVoted(data.vote);
				} else {
					Voting.unmarkVoted();
				}
			}
		});
	},
	vote: function(elm) {
		var points = this.settings.container.children().index(elm) + 1;
		this.sendVote(points);
	},
	
	sendVote: function(points) {
		jQuery.ajax({
			url: '?action=vote&points='+points + '&product=' + this.settings.container.attr('rel'),
			dataType: 'json',
			success: function(data) {
				if(data.success) {
					// voting akzeptiert
					Voting.markVoted(data.vote);
				} else {
					Voting.unmarkVoted();
				}
			}
		});
		
	},
	markVoted : function(points) {
		this.unmarkVoted();
		this.settings.container.children().each(function(idx, item){
			if(idx < points) {
				jQuery(item).addClass('active');
			}
		});
	},
	unmarkVoted : function() {
		this.settings.container.children().removeClass('active');
		
	}

}

