$(document).ready( function() {
	$("#band01,#band02,#band03").joSHCAScroll('a', 900, 'easeinout');
	
	/*
	$("#band03,#band04").bind("scroll", function(){
		window.status = 'Users scrolling ' + this.id;
	});
	*/

	$("a[@href$='#referenzen']").click( function() {
		//jQuery.jo.autoScroll('#band03', 'ul/li');
		jQuery('#band03').joAutoScroll('#areferenzen');
		return false;
	});
	
	$("a[@href$='#impressionen']").click( function() {
		//jQuery.jo.autoScroll('#band04', 'img');
		jQuery('#band04').joAutoScroll('#aimpressionen', 39);
		return false;
	});

});

// hint: $('#band03').get(0).scrollLeft IST GLEICH
//       document.getElementById("band03").scrollLeft;

// wegen horiz. Scroll ist auf der Seite jeweils ein
// zweiter Anchor selben Namens mit Underscore am Ende
// des Elements eingebaut, als Fallback, wenn javascript
// nicht aktiv ist. split('_') entfernt es, da jetzt unnoetig.

// todo:
// $('#scroll01 > .content').children() wird fuer lange
// Folgen im IE sehr langsam



jQuery.fn.extend ({

	// joSHCScrollTo
	// Sanfter Horizontal Container Scroller
	// angelehnt an interfaceFX's ScrollTo
	joSHCScrollTo: function(speed, easing) {
		o = jQuery.speed(speed);
		return this.queue('joFX', function(){
			new jQuery.fx.joSHCScrollTo(this, o, easing);
		});
	},

	// Alle Anker-Links eines Containers mit SHCScroll ausstatten
	// angelehnt an 'macx'
	// Eingabe: aprefix    Anchorprefix Bsp. 'a' wenn #aphotos
	joSHCAScroll: function(aprefix, speed, easing) {
		aprefix = aprefix ? aprefix : '';
		return this.each( function() {
			jQuery('a[@href*="#'+aprefix+'"]', this).click( function(e) {
				var parts        = this.href.split('#');
				var scrolltarget = '#' + parts[1];
				var realtarget   = scrolltarget.split('_')[0]; // _ wg. fallback
				jQuery(realtarget).joSHCScrollTo(speed, easing);
				return false;
			});
		});
	},
	
	
	// Auto-Scroller
	// whichElements: neben class 'navi' die zu zaehlenden Elemente
	//                die die Breite ergeben
	joAutoScroll: function(ankerOnEnd, intervallSpeed) {
		// evt. this.each ???
		if (!intervallSpeed) {
			intervallSpeed = 26; //default 26
		}
		return this.queue('joFX', function(){
		
			new jQuery.fx.joAutoScroll(this, ankerOnEnd, intervallSpeed);
		});
	}

});



function jdebug(elm, minimal) {
	var Ausgabe = "";
	for (var val in elm)
		if (minimal)
			Ausgabe = Ausgabe + val + ', ';
		else
			Ausgabe = Ausgabe + val + ": " + elm[val] + "\n";
	alert(Ausgabe);
}

// Effect der einen Container scrollt
// angelehnt an interfaceFX ScrollTo
// Vorgaben: - Container enthaelt einen Wrapper (hier .content)
//           - fuer alle Elemente im Wrapper gilt: 
//                - horizontal nahtlos aneinander
//                - in selber DOM-Tiefe
//                - alle Elemente von wrapper nicht Komplex
//                  (margin/padding muss 0 sein, nicht hidden, etc.)
//                - aber: Elemente duerfen komplexe Elemente enthalten
// Beiwort:  Die Vorgaben sind einzuhalten, da aus Geschwindigkeitgruenden
//           die jQuery-Eigene Breitenabfrage nicht verwendet werden kann.
//           Die Breite bis zum Ziel wird mit jeder Anfrage neu berechnet,
//           somit ist es kein Problem das Benutzer z. B. andere
//           Schriftgroesse hat, oder diese aendert.
jQuery.fx.joSHCScrollTo = function (e, o, easing)
{
	var z = this;
	z.o = o; // speed (zahl)
	z.e = e; // e.id ist z. B. 'akontakt'
	z.easing = easing;

	z.scrollContainer = jQuery(z.e).parent().parent().get(0); // z.scrollContainer.id  = z.B. 'band01'
	x_start = z.scrollContainer.scrollLeft;

	// Ziel berechnen (Summe der Breite aller vorgaenger Elemente)
	x_end = 0;
	found = false;
	jQuery(z.e).parent().children().each( function() {
		if (this.id && (this.id == z.e.id)) {
			found = true;
		}
		if (!found) {
			//x_end += jQuery.css(this,'width'); //jquery is boring slow calculateing widths in IE
			x_end += this.offsetWidth;
		}
	});

	z.t=(new Date).getTime();
	z.endLeft = x_end;
	z.startLeft = x_start;

	z.step = function(){
		var t = (new Date).getTime();
		var n = t - z.t;
		var p = n / z.o.duration;
		if (t >= z.o.duration+z.t) {
			z.clear();
			setTimeout(function(){z.scroll(z.endLeft)},13);
		} else {
			if (!jQuery.easing || !jQuery.easing[z.easing]) {
				sl = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.endLeft-z.startLeft) + z.startLeft;
			} else {
				sl = jQuery.easing[z.easing](p, n, z.startLeft, (z.endLeft - z.startLeft), z.o.duration);
			}
			z.scroll(sl);
		}
	};
	z.scroll = function (l) {z.scrollContainer.scrollLeft = l}; // hier scrollLeft einstellen
	z.timer=setInterval(function(){z.step();}, 13);
	z.clear = function(){clearInterval(z.timer);z.timer=null;jQuery.dequeue(z.e, 'joFX');};
};


// AUTO-Scroller
jQuery.fx.joAutoScroll = function (e, ankerOnEnd, intervallSpeed)
{
	var z = this;

	z.e = e; // e.id ist z. B. 'band03'
	z.w = 2; // Pixel pro Zeiteinheit
	z.ankerOnEnd = ankerOnEnd;
	z.ispd = intervallSpeed;

	z.step = function(){
		delta = (self.innerWidth||document.body.clientWidth||0) + 30;
		if (z.e.scrollLeft > ( z.e.scrollWidth || z.e.innerWidth ) - delta) {
			z.clear();
			jQuery(z.ankerOnEnd).joSHCScrollTo(900, 'easeinout');
		} else {
			z.scroll();
		}
	}

	z.scroll = function () {z.e.scrollLeft += z.w}; // hier scrollLeft einstellen
	z.timer=setInterval(function(){z.step();}, z.ispd);
	z.clear = function(){clearInterval(z.timer);z.timer=null;jQuery.dequeue(z.e, 'joFX');};
};



/*
 * jQuery Easing v1.1.1 - http://gsgd.co.uk/sandbox/jquery.easing.php
 *
 * Uses the built in easing capabilities added in jQuery 1.1
 * to offer multiple easing options
 *
 * Copyright (c) 2007 George Smith
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

jQuery.extend({
	easing: {
		easein: function(x, t, b, c, d) {
			return c*(t/=d)*t + b; // in
		},
		easeinout: function(x, t, b, c, d) {
			if (t < d/2) return 2*c*t*t/(d*d) + b;
			var ts = t - d/2;
			return -2*c*ts*ts/(d*d) + 2*c*ts/d + c/2 + b;		
		},
		easeout: function(x, t, b, c, d) {
			return -c*t*t/(d*d) + 2*c*t/d + b;
		},
		expoin: function(x, t, b, c, d) {
			var flip = 1;
			if (c < 0) {
				flip *= -1;
				c *= -1;
			}
			return flip * (Math.exp(Math.log(c)/d * t)) + b;		
		},
		expoout: function(x, t, b, c, d) {
			var flip = 1;
			if (c < 0) {
				flip *= -1;
				c *= -1;
			}
			return flip * (-Math.exp(-Math.log(c)/d * (t-d)) + c + 1) + b;
		},
		expoinout: function(x, t, b, c, d) {
			var flip = 1;
			if (c < 0) {
				flip *= -1;
				c *= -1;
			}
			if (t < d/2) return flip * (Math.exp(Math.log(c/2)/(d/2) * t)) + b;
			return flip * (-Math.exp(-2*Math.log(c/2)/d * (t-d)) + c + 1) + b;
		},
		bouncein: function(x, t, b, c, d) {
			return c - jQuery.easing['bounceout'](x, d-t, 0, c, d) + b;
		},
		bounceout: function(x, t, b, c, d) {
			if ((t/=d) < (1/2.75)) {
				return c*(7.5625*t*t) + b;
			} else if (t < (2/2.75)) {
				return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
			} else if (t < (2.5/2.75)) {
				return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
			} else {
				return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
			}
		},
		bounceinout: function(x, t, b, c, d) {
			if (t < d/2) return jQuery.easing['bouncein'] (x, t*2, 0, c, d) * .5 + b;
			return jQuery.easing['bounceout'] (x, t*2-d,0, c, d) * .5 + c*.5 + b;
		},
		elasin: function(x, t, b, c, d) {
			var s=1.70158;var p=0;var a=c;
			if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
			if (a < Math.abs(c)) { a=c; var s=p/4; }
			else var s = p/(2*Math.PI) * Math.asin (c/a);
			return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		},
		elasout: function(x, t, b, c, d) {
			var s=1.70158;var p=0;var a=c;
			if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
			if (a < Math.abs(c)) { a=c; var s=p/4; }
			else var s = p/(2*Math.PI) * Math.asin (c/a);
			return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
		},
		elasinout: function(x, t, b, c, d) {
			var s=1.70158;var p=0;var a=c;
			if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
			if (a < Math.abs(c)) { a=c; var s=p/4; }
			else var s = p/(2*Math.PI) * Math.asin (c/a);
			if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
			return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
		},
		backin: function(x, t, b, c, d) {
			var s=1.70158;
			return c*(t/=d)*t*((s+1)*t - s) + b;
		},
		backout: function(x, t, b, c, d) {
			var s=1.70158;
			return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
		},
		backinout: function(x, t, b, c, d) {
			var s=1.70158;
			if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
			return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
		},
		linear: function(x, t, b, c, d) {
			return c*t/d + b; //linear
		}
	}
});
