/**
 * @author Nicolai Lang
 * 
 * This Class is related to the slideshow type of thing on the Products Page.
 * The following code doesn't concern the m_Slideshow Module in any way...
 * 
 */


var Slideshow = Class.create();

Slideshow.prototype = {

	slideInterval: null,
	slideBusy: false,
	bodyWidth: 0,
	doAgain: [],
	images: null,
	imgIndex: 0,
	blind: false,
	data: null,
	maxOffset: 0,
	
	initialize: function(blind, bodyWidth, data) {
				
		if (true == blind) this.blind = true;
		this.data = data;
		this.bodyWidth = bodyWidth;
			
		var container = $('image_slider_body');
		
		container.innerHTML = '';
		$('image_slider_transparency_left').style.width = 0 + "px";
		$('image_slider_transparency_right').style.width = 0 + "px";
				
		var images = this.getImages();
		var length = images.length;
		var images_show = [];
		var imgWidth = this.getTotalImagesWidth();
		var factor = 1;
				
		for (var i = 0; i < length; i++) {
			
			var elem = {
				id_node: "img_node_" + images[i].id_node,
				width: images[i].width,
				src: images[i].src
			};
			images_show.push(elem);
		}
		
		container.scrollLeft = "0px";
		
		
		for (var i = 0; i < images_show.length; i++) {
						
			var ni = this.createImage(images_show[i]);
			container.appendChild(ni);
		}	
		
		container.appendChild(ni);			
		this.maxOffset = this.getTotalImagesWidth() - this.getSliderBodyWidth();
		if (this.maxOffset < 0) this.maxOffset = 0;
						
		this.showDetailImage( container.childNodes[0] );
		this.checkLeftRightButtons(0); 
		
		container.show();
	},
	
	scrollHorizontal: function(dir, fast) {
		
		var curImg = $$('.slideshow_active')[0];
		var slide = $('image_slider_body');	
		var scrollDelta = 150;
		
		
		if (this.slideBusy == true) {	
			
			if( 'left' == dir && this.doAgain.length < this.imgIndex )
				this.doAgain.push(dir);
				
			if( 'right' == dir && this.doAgain.length < (this.images.length-this.imgIndex-1) )
				this.doAgain.push(dir);
				
			return;
		}
		
		this.slideBusy = true;		
		var oldOffset = slide.scrollLeft;
		
		if ('left' == dir && this.imgIndex > 0) {
			
			this.imgIndex--;
			var newOffset = (oldOffset - scrollDelta);
			if( newOffset < 1 )	newOffset = 0;
		}
		else if ('right' == dir) {
			
			this.imgIndex++;
			var newOffset = (oldOffset + scrollDelta);
			if( newOffset >= this.maxOffset ) newOffset = this.maxOffset;
		}	
				
		if (newOffset > oldOffset) {
			
			this.slideInterval = window.setInterval(
				
				function() {
						
					window.slide.slideRight(window.slide, newOffset);	
				}, 3
				
			);
		}
		else if (newOffset < oldOffset) {
			
			this.slideInterval = window.setInterval(
				
				function() {
						
					window.slide.slideLeft(window.slide, newOffset);	
				}, 3
			);
		} else {
			
			this.slideBusy = false;		
		}
			
		
	},

	slideLeft: function(obj, newOffset) {
										
		var slide = $('image_slider_body');
									
		if (slide.scrollLeft > newOffset) {
			if (obj.doAgain.length == 0 && (slide.scrollLeft - newOffset) < 10) {
				slide.scrollLeft -= 1;
			}
			else 
				if (obj.doAgain.length == 0 && (slide.scrollLeft - newOffset) < 20) {
					slide.scrollLeft -= 2;
				}
				else if (obj.doAgain.length == 0 && (slide.scrollLeft - newOffset) < 30) {
					slide.scrollLeft -= 3;
				}
				else if (obj.doAgain.length > 0) {
					slide.scrollLeft -= 12;
				}
				else slide.scrollLeft -= 4;
				
			this.checkLeftRightButtons(slide.scrollLeft);
		}
		else {
			
			//obj.prependImage();
			window.clearInterval(obj.slideInterval);
			obj.slideBusy = false;
			
			if (obj.doAgain.length > 0)  {
				obj.scrollHorizontal(obj.doAgain.pop());
			}
		}
	},

	slideRight: function(obj, newOffset) {
												
		var slide = $('image_slider_body');
										
		if (slide.scrollLeft < newOffset) {
			if (obj.doAgain.length == 0 && (newOffset - slide.scrollLeft) < 10) {
				slide.scrollLeft += 1;
			}
			else if (obj.doAgain.length == 0 && (newOffset - slide.scrollLeft) < 20) {
				slide.scrollLeft += 2;
			}
			else if (obj.doAgain.length == 0 && (newOffset - slide.scrollLeft) < 30) {
				slide.scrollLeft += 3;
			}
			else if (obj.doAgain.length > 0) {
				slide.scrollLeft += 12;
			}
			else slide.scrollLeft += 4;
						
			this.checkLeftRightButtons(slide.scrollLeft);
		}
		else {
			//obj.appendImage();
			
			window.clearInterval(obj.slideInterval);
			obj.slideBusy = false;
			
			if (obj.doAgain.length > 0) {
				obj.scrollHorizontal(obj.doAgain.pop());
			}
		}
	},
	
	checkLeftRightButtons: function(curOffset) {
		
		if (this.maxOffset == 0) {
			$('btn_slideLeft').hide();
			$('btn_slideRight').hide();
			return;
		}
		
		if ( curOffset == 0 ) 
			$('btn_slideLeft').hide();
		else 
			$('btn_slideLeft').show();
			
		if ( curOffset == this.maxOffset )
			$('btn_slideRight').hide();
		else 
			$('btn_slideRight').show();
	},
	
	createImage: function(data) {
		
		var ni = document.createElement('img');
		ni.src = data.src;
		ni.style.marginLeft = "3px";
		ni.style.height = "100px";
		var w = "" + data.width;
		w = w.replace(/px/g, '');
		ni.style.width = w + "px";
		ni.style.cursor = "pointer";
		ni.id = data.id_node;
				 
		Event.observe(ni, 'click', function(evt) {
			//window.slide.scrollHorizontal(Event.element(evt), false);
			window.slide.showDetailImage(Event.element(evt));
		});
			
		return ni;
	},

	getNext: function(img) {

		if ($$('.slideshow_active')[0].nextSibling.id != 'dummy')
			return $$('.slideshow_active')[0].nextSibling;
		else return undefined;
	},
	
	getPrevious: function(img) {
		
		return $$('.slideshow_active')[0].previousSibling;
	},

	getImagePosition: function(img, pos) {
		
		if (pos == 'start') {
			var offset = 0;
		}
		else if (pos == 'middle') {
			
			var w = parseInt(img.style.width.replace(/px/g, ''));
			var offset = (w / 2);
		}
		else if (pos == 'end') {
			var offset = parseInt(img.style.width.replace(/px/g, ''));
		}
			
		var node = img; 
		
		while (node.previousSibling) {
			node = node.previousSibling;
			var w = parseInt(node.style.width.replace(/px/g, ''));
			offset += (w + 3);
		}
							
		return Math.round(offset);
	},

	getVisibleArea: function() {
	
		var o = {
			start: $('image_slider_body').scrollLeft,
			end: $('image_slider_body').scrollLeft + $('image_slider_body').clientWidth
		};
		
		return o;
	},

	isVisible: function(img) {
		
		var imgStart = getImagePosition(img, 'start');
		var imgEnd = getImagePosition(img, 'end');
		var sliderArea = getVisibleArea();
			
		var visStart = false;
		var visEnd = false;
					
		if (imgStart >= sliderArea.start && imgStart <= sliderArea.end) visStart = true;
		if (imgEnd >= sliderArea.start && imgEnd <= sliderArea.end) visEnd = true;
		
		if (visStart && visEnd) return 2;
		if (!visStart && !visEnd) return 0;
	
		return 1;
	},
	
	getSliderBodyWidth: function() {
		return this.bodyWidth;
	},
	
	getTotalImagesWidth: function() {
		
		var imgs = this.getImages();
		var width = 0;
		for (var i = 0; i < imgs.length; i++) {
			width += imgs[i].width +3;
		}
		
		return Math.ceil(width);
	},

	getCurrentImage: function() {
		
		return $$('.slideshow_active')[0];
	},
	
	getImages: function() {
		
		if (this.images == null) {
			this.images = this.data;
		}
				
		return this.images;
	},
	
	showDetailImage: function (img) {
		
		var curLang = $F('curLang');
		var slide = $('image_slider_body');	
		var cI = img;
		var pI = new Image();
		
		// click rightmost picture -> scroll 2x right
		if ( (this.getImagePosition(img, "end")+10 - slide.scrollLeft) > this.bodyWidth )  {
			
			this.scrollHorizontal("right", true);	
				
			if(img.id != slide.lastChild.id)
				this.doAgain.push('right');
			
		} else if (this.getImagePosition(img, "start")-10 < slide.scrollLeft) {
			
			this.scrollHorizontal("left", true);
			
			if( img.id != slide.firstChild.id )
				this.doAgain.push('left');
				
		}
						
		if( $('btnProductDetails').hasClassName('nav_prod_on') )
			pI.src = cI.src + "&w=712&h=380&m=";
		else if( $('btnReferences').hasClassName('nav_prod_on') ) {

			if( cI.src.match(/(.*)no_image(.*)/) )
				pI.src = cI.src
			else 
				pI.src = cI.src + "&w=423&h=380&m=";
		}
		else
			pI.src = cI.src + "&w=712&h=380&f=1&m=";
		
				
		Effect.Fade($('img_detail'), { duration: 0.1 }); //Effect.Puff
		Effect.Fade($('product_detail'), { duration: 0.1 });
		
		var id_node = cI.id.substr(9);		
				
		ival = window.setInterval(function() {
					
			if (pI.complete == true) {
				
				$('img_detail').src = pI.src;	
				$('img_detail').alt = "";			
				
				if( $('btnProductDetails').hasClassName('nav_prod_on') ) {
		
					new Ajax.ServerCall( "ProductModul", "products_getProductTexts", [id_node, curLang], { onSuccess: function(response) {
					
						data = eval(response.responseText);
						$('product_detail_title').innerHTML = data[0].titel;
						$('product_detail_text').innerHTML = data[0].text;
						
					}});
					Effect.Appear($('product_detail'), {to: 0.99, duration: 0.1} );
				}
				Effect.Appear($('img_detail'), { duration: 0.1 });
					
				window.clearInterval(ival);
			}
			
		}, 120);
		
	}
};
