/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * jFlow
 * Version: 1.2 (July 7, 2008)
 * Requires: jQuery 1.2+
 */

 
(function($j) {

	$j.fn.jFlow = function(options) {
		var opts = $j.extend({}, $j.fn.jFlow.defaults, options);
		var randNum = Math.floor(Math.random()*11);
		var jFC = opts.controller;
		var jFS =  opts.slideWrapper;
		var jSel = opts.selectedWrapper;

		var cur = 0;
		var maxi = $j(jFC).length; //Anzahl der zu slidenden Boxen

		a = 0; //aktuelles div
		// sliding function; i = zu slidendes div
		var slide = function (dur, i) {
	
			m = parseFloat(document.getElementById('slides').style.marginLeft);

			slide_margins = 0;		
			for (b=1;b<(i+1);b++){					
				//Größenänderung slides beachten!
				if ((a+1)==b){
					slide_margins = slide_margins - slide_width_sml[a+1] -16;
				} else {
					slide_margins = slide_margins - $j('#slide_'+b).width() -16;				
				}
			}
			slide_margins = slide_margins + parseFloat(opts.width)/2 - slide_width_big[i+1]/2;

			$j(opts.slides + " iframe").hide().addClass("temp_hide");

			$j(opts.slides).animate({
				//geht so von der Breite des ersten div aus:
				//marginLeft: "-" + (i * $j(opts.slides).find(":first-child").width() + "px")}, 
				marginLeft: slide_margins + "px"}, 					
				opts.duration*(dur),
				opts.easing,
				function(){
					$j(".temp_hide").show();
				}
			);

			//Bild vergößern und verkleinern			
			new Effect.Morph('gal_img_'+(a+1), {
          		style: 'height: 180px;padding-top:10px;',
          		transition: Effect.Transitions.sinoidal,
          		duration: 0.8
      		})

		   	new Effect.Morph('gal_img_'+(i+1), {
				style: 'height: 200px;padding-top:0px;',
          		transition: Effect.Transitions.sinoidal,
          		duration: 0.8
			}); 
			
			width_sml = slide_width_sml[a+1];
			width_big = slide_width_big[i+1];

			new Effect.Morph('slide_'+(a+1), {
          		style: 'width:'+width_sml+'px',
          		transition: Effect.Transitions.sinoidal,
          		duration: 0.8
      		})

		   	new Effect.Morph('slide_'+(i+1), {
				style: 'width:'+width_big+'px',
          		transition: Effect.Transitions.sinoidal,
          		duration: 0.8
			}); 

			a = i;
		}

		$j('#slides').find(jFC).each(function(i){
			$j(this).click(function(){
				//Click auf aktuelles Bild öffnet Thickbox

				if (a==i){
				   tb_remove();
					 href=this.getElementsByTagName('a')[0];
					 href=href+'';
				   tb_show('',href,false);					
				} else {
					if ($j(opts.slides).is(":not(:animated)")) {
						$j(jFC).removeClass(jSel);
						$j(this).addClass(jSel);
						var dur = Math.abs(cur-i);
						slide(dur,i);
						cur = i;
					}					
				}
			
			});
		});	
		
		$j(opts.slides).before('<div id="'+jFS.substring(1, jFS.length)+'"></div>').appendTo(jFS);
		
		$j(opts.slides).find("div").each(function(){
			$j(this).before('<div class="gallery_container"></div>').appendTo($j(this).prev());		
		});
		
		//initialize the controller
		$j(jFC).eq(cur).addClass(jSel);
		
		var resize = function (x){
			$j(jFS).css({
				position:"relative",
				width: opts.width,
				width: opts.width,
				height: opts.height,
				overflow: "hidden"
			});

			
			//opts.slides or #mySlides container
			$j(opts.slides).css({
				position:"relative",
				width: $j(jFS).width()*$j(jFC).length+"px",
				height: $j(jFS).height()+"px",
				overflow: "hidden"
			});

		
			// jFlowSlideContainer
			$j(opts.slides).children().css({
				height: $j(jFS).height()+"px",
				"float":"left"
			});

			//Anfangswert initialisieren
			if (typeof slide_margins == 'undefined'){ slide_margins = opts.marginLeft };			
		
			$j(opts.slides).css({
				//marginLeft: "-" + (cur * $j(opts.slides).find(":eq(0)").width() + "px")		
				marginLeft : slide_margins + "px"
			});
		}
		
		// sets initial size
		resize();

		// resets size
		$j(window).resize(function(){
			resize();						  
		});

		//prev und next nur, wenn es mehr als ein Element gibt
		if (maxi>1){

				$j(opts.prev).click(function(){
					if ($j(opts.slides).is(":not(:animated)")) {
						var dur = 1;
						if (cur > 0)
							cur--;
						else {
							cur = maxi -1;
							dur = cur;
						}
						$j(jFC).removeClass(jSel);
						slide(dur,cur);
						$j(jFC).eq(cur).addClass(jSel);
					}
				});
				
				$j(opts.next).click(function(){
					if ($j(opts.slides).is(":not(:animated)")) {
						var dur = 1;
						if (cur < maxi - 1)
							cur++;
						else {
							cur = 0;
							dur = maxi -1;
						}
						$j(jFC).removeClass(jSel);
						slide(dur, cur);
						$j(jFC).eq(cur).addClass(jSel);		
					}
				});
		
		}
	};

	$j.fn.jFlow.defaults = {
		controller: ".jFlowControl", // must be class, use . sign
		slideWrapper : "#jFlowSlide", // must be id, use # sign
		selectedWrapper: "jFlowSelected",  // just pure text, no sign
		easing: "swing",
		duration: 900,
		width: "100%",
		prev: ".jFlowPrev", // must be class, use . sign
		next: ".jFlowNext" // must be class, use . sign
	};
	
})(jQuery);
