var Strip = new function() {
	var _this;
	var _strip;
	var _transform;
	var _perspective;
	var _inner;
	var _width;
	var _widthh;
	var _height;
	var _distance;
	var _length;
	var _center;
	var _calcmargin;
	var _scale;
	var _iscale;
	var _angle;
	var _offset;
	var _middle;
	var _left;
	var _right;
	var _scroll;
	var _index;
	var _timer;
	var _mousedata;
	var _velocity;
	var _gravity;
	var _target;
	var _mousedown;
	
	{
		_this = this;
	}
	
	function getValidProperty(properties) {
		var test = $("<div></div>").get(0);
		var i = properties.length;
		while(i--) {
			property = properties[i];
			if(test.style[property] != null) break;
			else property = null;
		}
		return property;
	}
	
	function mouseDownHandler(event) { 
		if(event.keyCode==0 || event.keyCode==39 || event.keyCode==37 || event.keyCode==13 || !event.keyCode || event.keyCode==40){
            var down = false;
            var x;
            var o = event.originalEvent;
            if(o.touches) {
                if(o.touches.length == 1) {
                    down = true;
                    x = o.touches[0].pageX;
                }
            }
            else {
                down = true;
                x = event.pageX;
            }
            if(down) {
                event.preventDefault();
                if($(event.currentTarget).attr('id')==='next' || event.keyCode==39){
                    _mousedata.t = _middle.next();
                } else if($(event.currentTarget).attr('id')==='back' || event.keyCode==37) {
                    _mousedata.t = _middle.prev();
                } else if(event.keyCode==13 || event.keyCode==40) {
                    _mousedata.t = _middle;
                } else if (event.keyCode==0 || !event.keyCode) {
                    _mousedata.t = $(event.currentTarget);
                }            
                _mousedata.x = x;
                _mousedata.s = _mousedata.x;
                _mousedata.l = _mousedata.x;
                _mousedata.c = true;
                _mousedown = true;
                $(document).bind("mousemove touchmove", mouseMoveHandler).bind("mouseup touchend keyup", mouseUpHandler);
                if(!_timer) timerHandler();
            }
        }
	}
	
	function mouseMoveHandler(event) {
		var o = event.originalEvent;
		if(o.touches) _mousedata.x = o.touches[0].pageX;
		else _mousedata.x = event.pageX;
		if(_mousedata.c && Math.abs(_mousedata.x-_mousedata.s) > 5) {
			_mousedata.c = false;
			_middle.trigger("_blur");
		}
	}
	
	function mouseUpHandler(event) {
		_mousedown = false;
		if(_mousedata.c) {
			var index = _mousedata.t.index();
			if(index == _center && (event.keyCode==13 || event.keyCode==0 || !event.keyCode || event.keyCode==40)) {
				_middle.trigger("_selected");
			}
			else {
				_velocity = 0;
				_target = index+_index;
			}
			_mousedata.c = false;
		}
		$(document).unbind("mousemove touchmove", mouseMoveHandler).unbind("mouseup touchend keyup", mouseUpHandler);
	}
	
	function timerHandler() {
		_timer = null;
		var delta;
		if(_mousedown) {
			delta = (_mousedata.l-_mousedata.x)/_offset;
			_mousedata.l = _mousedata.x;
			_velocity = (_velocity+delta)*0.2;
			_this.scroll(_scroll+delta);
			_timer = setTimeout(timerHandler, 50);
		}
		else if(_velocity != 0) {
			_velocity *= 0.9;
			if(Math.abs(_velocity) < 0.05) {
				var gravity;
				delta = _index-_scroll;
				if(Math.abs(delta) < 0.05) {
					gravity = delta;
					_velocity = 0;
					_this.scroll(_scroll+gravity);
					_middle.trigger("_centered");
				}
				else {
					gravity = delta/2;
					_this.scroll(_scroll+_velocity+gravity);
					_timer = setTimeout(timerHandler, 50);
				}
			}
			else {
				_this.scroll(_scroll+_velocity);
				_timer = setTimeout(timerHandler, 50);
			}
		}
		else if(_target !== null) {
			delta = _target-_center-_scroll;
			if(Math.abs(delta) < 0.05) {
				_this.scroll(_target-_center);
				_target = null;
				_middle.trigger("_centered");
			}
			else {
				delta /= 5;
				_this.scroll(_scroll+delta);
				_timer = setTimeout(timerHandler, 50);
			}
		}
	}
	
	_this.init = function(selector) {
		_strip = $(selector);
		_transform = getValidProperty(["OTransform", "msTransform", "WebkitTransform", "MozTransform", "transform"]);
		_perspective = getValidProperty(["WebkitPerspective"]);
        if(_transform) {
			var obj;
			if(_perspective) {
				_strip.css(_perspective+"Origin", "0 50%");
				$.fn.extend({
					_fnscalerotate: function(value) {
						var angle = -value*_angle;
						var scale = 1-Math.abs(value)*_iscale;
						obj = new Object();
						obj["margin"] = "0 "+(scale*_widthh*Math.abs(Math.cos(angle))+_calcmargin)+"px";
						obj[_transform] = "scale("+scale+") rotateY("+angle+"rad)";
						return this.each(function() {
							$(this).css(obj);
						});
					}
				});
				_this.scroll = function(value) {
					_scroll = value;
					var index = Math.round(_scroll);
					var delta = index-_scroll;
					var step = (index-_index)%_length;
					if(step > 0) {
						if(step > 3) {
							var t = step-2;
							var box = _right.next();
							while(t-- && box.length > 0) {
								box._fnscalerotate(-1);
								box = box.next();
							}
						}
						if(step > 2) _right._fnscalerotate(-1);
						if(step > 1) _middle._fnscalerotate(-1);
						_left._fnscalerotate(-1);
						while(step-- > 0) {
							_inner.children().first().appendTo(_inner)._fnscalerotate(1);
                            if(_inner.children().length>8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).first().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().next().css('visibility', 'visible');
                            }
                            if(_inner.children().length==8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'hidden');
                                }).first().css('visibility', 'visible');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().css('visibility', 'hidden');

                            }
						}
						_middle = $(_inner.children().get(_center));
						_left = _middle.prev();
						_right = _middle.next();
					}
					else if(step < 0) {
						_right._fnscalerotate(1);
						if(step < -1) _middle._fnscalerotate(1);
						if(step < -2) _left._fnscalerotate(1);
						if(step < -3) {
							var t = step+2;
							var box = _left.prev();
							while(t++ && box.length > 0) {
								box._fnscalerotate(1);
								box = box.prev();
							}
						}
						while(step++ < 0) {
							_inner.children().last()._fnscalerotate(-1).prependTo(_inner);
                            if(_inner.children().length>8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).first().prev().css('visibility', 'visible');
                            }
                            if(_inner.children().length==8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'hidden');
                                }).first().css('visibility', 'visible');
                            }
						}
						_middle = $(_inner.children().get(_center));
						_left = _middle.prev();
						_right = _middle.next();
					}
					if(delta >= 0) _left._fnscalerotate(-1+delta);
					else _left._fnscalerotate(-1);
					_middle._fnscalerotate(delta);
					if(delta <= 0) _right._fnscalerotate(1+delta);
					else _right._fnscalerotate(1);
					_inner.css("margin-left", (_offset*delta)+"px");
					_index = index;
				};
			}
			else {
				$.fn.extend({
					_fnscale: function(value) {
						obj = new Object();
						obj["margin"] = "0 "+(value*_widthh+_calcmargin)+"px";
						obj[_transform] = "scale("+value+")";
						return this.each(function() {
							$(this).css(obj);
						});
					}
				});
				_this.scroll = function(value) {
					_scroll = value;
					var index = Math.round(_scroll);
					var delta = index-_scroll;
					var step = (index-_index)%_length;
					if(step > 0) {
						if(step > 2) _right._fnscale(_scale);
						if(step > 1) _middle._fnscale(_scale);
						_left._fnscale(_scale);
						while(step-- > 0) {
							_inner.children().first().appendTo(_inner);
                            if(_inner.children().length>8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).first().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().next().css('visibility', 'visible');
                            }
                            if(_inner.children().length==8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'hidden');
                                }).first().css('visibility', 'visible');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().css('visibility', 'hidden');

                            }
						}
						_middle = $(_inner.children().get(_center));
						_left = _middle.prev();
						_right = _middle.next();
					}
					else if(step < 0) {
						_right._fnscale(_scale);
						if(step < -1) _middle._fnscale(_scale);
						if(step < -2) _left._fnscale(_scale);
						while(step++ < 0) {
							_inner.children().last().prependTo(_inner);
                            if(_inner.children().length>8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).first().prev().css('visibility', 'visible');
                            }
                            if(_inner.children().length==8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'visible');
                                }).last().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') == 'hidden');
                                }).first().css('visibility', 'visible');
                            }
						}
						_middle = $(_inner.children().get(_center));
						_left = _middle.prev();
						_right = _middle.next();
					}
					if(delta >= 0) _left._fnscale(_scale+delta*_iscale);
					else _left._fnscale(_scale);
					_middle._fnscale(_scale+(1-Math.abs(delta))*_iscale);
					if(delta <= 0) _right._fnscale(_scale-delta*_iscale);
					else _right._fnscale(_scale);
					_inner.css("margin-left", (_offset*delta)+"px");
					_index = index;
				};
			}
		}
		else {
			_this.scroll = function(value) {
				_scroll = value;
				var index = Math.round(_scroll);
				var delta = index-_scroll;
				var step = index-_index;
				if(step > 0) {
					while(step-- > 0) {
						_inner.children().first().appendTo(_inner);
                        if(_inner.children().length>8){
                            _inner.children().filter(function() {
                                return ($(this).css('visibility') === 'visible');
                            }).first().css('visibility', 'hidden');
                            _inner.children().filter(function() {
                                return ($(this).css('visibility') === 'visible');
                            }).last().next().css('visibility', 'visible');
                        }
                        if(_inner.children().length==8){
                            _inner.children().filter(function() {
                                return ($(this).css('visibility') === 'hidden');
                            }).first().css('visibility', 'visible');
                            _inner.children().filter(function() {
                                return ($(this).css('visibility') === 'visible');
                            }).last().css('visibility', 'hidden');

                        }
					}
                    _middle = $(_inner.children().get(_center));
                    _left = _middle.prev();
                    _right = _middle.next();
				}
				else if(step < 0) {
					while(step++ < 0) {
						_inner.children().last().prependTo(_inner);
                            if(_inner.children().length>8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') === 'visible');
                                }).last().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') === 'visible');
                                }).first().prev().css('visibility', 'visible');
                            }
                            if(_inner.children().length==8){
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') === 'visible');
                                }).last().css('visibility', 'hidden');
                                _inner.children().filter(function() {
                                    return ($(this).css('visibility') === 'hidden');
                                }).first().css('visibility', 'visible');
                            }
					}
                    _middle = $(_inner.children().get(_center));
                    _left = _middle.prev();
                    _right = _middle.next();
				}
				_inner.css("margin-left", (_offset*delta)+"px");
				_index = index;
			};
		}

        if($('.hproduct').length>7){
            $('.hproduct').each(function(){
                if($('.hproduct').length % 2 == 0){
                    if(($('.hproduct').index($(this))-2)>($('.hproduct').length/2) || ($('.hproduct').index($(this))-$('.hproduct').length/2)<-4){
                        $(this).css('visibility', 'hidden');
                    }
                } else {
                    if(($('.hproduct').index($(this))-3)>($('.hproduct').length/2) || ($('.hproduct').index($(this))-$('.hproduct').length/2)<-4){
                        $(this).css('visibility', 'hidden');
                    }
                }
            });
        }
        $(document).unbind('keydown', flashNav);
        $('#next').die('click', flashNav);
        $('#back').die('click', flashNav);
        $('#next').bind("mousedown", mouseDownHandler);
        $('#back').bind("mousedown", mouseDownHandler);
        $(document).unbind("keydown", mouseDownHandler);
        $(document).bind("keydown", mouseDownHandler);
        //$(document).live("keydown", mouseDownHandler);
	};
	
	_this.activate = function(width, height, distance, scale, angle, active) {
		if(_timer) {
			clearTimeout(_timer);
			_timer = null;
		}
		_inner = _strip.children().first();
		_width = width;
		_widthh = _width/2;
		_height = height;
		_distance = distance/2;
		_inner.children().css({width: _width+"px", height: _height+"px", overflow: "visible", margin: "0 "+_distance+"px"}).bind("mousedown touchstart", mouseDownHandler);
		_length = _inner.children().length;
		var last = _length-1;
		var stripwidth = _width+distance;
		var stripoffset;
		_center = Math.floor(last/2);
		_calcmargin = _distance-_widthh;
		_middle = $(_inner.children().get(_center));
		_left = _middle.prev();
		_right = _middle.next();
		if(_transform) {
			_scale = scale;
			_iscale = 1-_scale;
			if(_perspective) {
				_angle = angle;
				_offset = _width*_scale*Math.abs(Math.cos(_angle))+distance;
				var obj = new Object();
				obj[_perspective] = "1024";
				obj[_transform+"Style"] = "preserves-3d";
				_inner.css(obj);
			}
			else {
				_offset = _width*_scale+distance;
				_inner.children()._fnscale(_scale);
			}
		}
		else {
			_offset = stripwidth;
		}
		stripoffset = -stripwidth/2-_offset*_center;
		stripwidth += _offset*last+_offset;
		_inner.css({width: (stripwidth)+"px", height: _height+"px", overflow: "visible"});
		_strip.css("margin-left", (stripoffset)+"px");
		_scroll = 0;
		_index = 0;
        _this.scroll(0-_center);
        var help = $('div[name="'+active+'"]');
        var position = $('div.hproduct').index(help);
        if (position!=-1){
            _this.scroll(position+2)
        }
        if (_perspective) {
            _middle.prevAll()._fnscalerotate(-1);
            _middle.nextAll()._fnscalerotate(1);
        }
		_mousedata = {t: null, x: 0, s: 0, l: 0, c: false};
		_velocity = 0;
		_gravity = 0;
		_target = null;
		_mousedown = false;
		_middle.trigger("_centered");
        if(!_perspective){
            $('a#back').css('margin-left', '-820px');
            $('a#next').css('margin-left', '793px');
            $('.big').remove();
            var bigger = $('.overlay').clone();
            bigger.css({position: 'absolute', zIndex: 11, marginLeft: '-149px', left: '50%', top: '50%', marginTop: _margintop, display: 'block'});
            bigger.addClass('big');
            bigger.children('div').css({display: 'table-cell', verticalAlign: 'middle', padding: '0 20px'});
            bigger.prependTo($('body'));
            bigger.animate({marginLeft: '-250px', marginTop: '-'+(250+_margintop)+'px'}, 500);
            bigger.children('div').animate({width: 460, height: 500}, 500, function(){
                bigger.children('div').first().html('Für eine bessere Darstellung installieren Sie bitte den Adobe Flash Player!<br /><a href="http://get.adobe.com/de/flashplayer/" target="_blank">Hier herunterladen!</a>');
                $(document).one('touchstart', closeOverlay);
                $('#close').one('touchstart', closeOverlay);
                $('body, #close').one('click', closeOverlay);
                bigger.bind('click', function(event){
                    event.stopPropagation();
                });
                $('iframe').bind('touchstart', function(event){
                    event.stopPropagation();
                });
                bigger.bind('touchstart', function(event){
                    event.stopPropagation();
                });
            });  
        }
	};
}
