/**
* @ TODO left right bug eruit halen
* 			 het style attribute echt verwijderen
**/

jQuery.fn.extend({
	ffiSlider : function(opt)
	{
		var options 						= opt;
		var autoslide						= getOption('autoslide', true); // true | false
		var interval						= getOption('interval', 6000); // int
		var bannerWrap					= getOption('bannerWrap', 'banner'); // CLASS
		var bannerWrap_height		= getOption('bannerWrap_height', 500); // int
		var bannerWrap_width		= getOption('bannerWrap_width', 800); // int
		var slide 							= getOption('slide', 'vertical'); // horizontal | vertical
		var slidespeed					= getOption('slidespeed', 1000); // int
		var doAnimation					= getOption('doAnimation', true);
		var slideAutoTo					= getOption('slideAutoTo', 'standard'); // standard | reverse
		var tiktakslide					= getOption('tiktakslide', false); // true | false
		var nextbutton					= getOption('nextbutton', 'slider-next');
		var prevbutton					= getOption('prevbutton', 'slider-prev');
		var numberbutton				= getOption('numberbutton', 'slider-number');
		var numberprefix				=	getOption('numberbutton', 'slider-');
		
		
		//processsettings
		var jAnimationStop			= false;
		var jCurrent						= 0;
		var jFrame 							= $(this);
		var jBannerWrap 				= $(this).find('.'+bannerWrap);
		var jTotalWrap					= jBannerWrap.size();
		var jPrevButton					= $('#'+prevbutton);
		var jNextButton					= $('#'+nextbutton);
		var jNumberButton				= $('.'+numberbutton);
		var jAnimationProgress 	= false;
		var jClickNumber				= 0;
		
		function process()
		{
			//Set the banner wrapper and process first state of the banner
			setFrame();
			setWrap();
			
			addObjectListner();
			
			
			setSlideInterval();
		}
		
		function setSlideInterval()
		{
			if(autoslide === true)
			{
				inter = jQuery.timer.timeParse(interval);
			
				$(document).everyTime(inter,"load",function(){
					if(jAnimationStop == false)
					{
						if(slideAutoTo == 'standard')
							loadNext();
						if(slideAutoTo == 'reverse')
							loadPrev();
						
						if(tiktakslide == true)
						{
							if(slide == 'vertical')
								slide = 'horizontal';
							else
								slide = 'vertical';
						}
					}
				});
			}
		}
		
		function getOption(opt, defaultvalue)
		{
			return options[opt] !== undefined ? options[opt] : defaultvalue;
		}
		
		function setWrap()
		{
			jBannerWrap.removeAttr('style');
			jBannerWrap.css({
				'position' 		: 'absolute',
				'height' 			: bannerWrap_height+'px',
				'width' 			: bannerWrap_width+'px',
				'overflow' 		: 'hidden',
				'display'			: 'none'
			});
			
			jBannerWrap.first().show();
		}
		
		function setFrame()
		{
			jFrame.css({
				'position'	 	: 'relative',
				'overflow'	 	: 'hidden',
				'height' 			: bannerWrap_height+'px',
				'width' 			: bannerWrap_width+'px',
				'display'			: 'block'
				
			});	
		}
		
		function setSlideDefaultStyle()
		{
			jBannerWrap.removeAttr('style');
			jBannerWrap.css({
				'position' 		: 'absolute',
				'height' 			: bannerWrap_height+'px',
				'width' 			: bannerWrap_width+'px',
				'overflow' 		: 'hidden',
				'display'			: 'none'
			});
		}
		
		function addObjectListner()
		{
			jNextButton.live("mouseenter", function()
			{
				if(jAnimationProgress == false)
				{
					if(slideAutoTo == 'standard')
						loadNext();
					if(slideAutoTo == 'reverse')
						loadPrev();
					
					if(tiktakslide == true)
					{
						if(slide == 'vertical')
							slide = 'horizontal';
						else
							slide = 'vertical';
					}
				}
				return false;
			});
			
			jPrevButton.live("mouseenter",function()
			{
				if(jAnimationProgress == false)
				{
					if(slideAutoTo == 'standard')
						loadPrev();
					if(slideAutoTo == 'reverse')
						loadNext();
						
					if(tiktakslide == true)
					{
						if(slide == 'vertical')
							slide = 'horizontal';
						else
							slide = 'vertical';
					}
				}
				return false;
			});
			
			jNumberButton.live("mouseover", function (){
				
				$(document).stopTime("load");
				if(jAnimationProgress == false)
				{
					$iNumber 			= $(this).attr('id');
					$iNumber 			= $iNumber.split('-');
					$iNumber 			= $iNumber[1];
					jClickNumber	= $iNumber;
					if($iNumber < jCurrent)
					{
						
						interNumberPress = jQuery.timer.timeParse(slidespeed+10);
			
						$(document).everyTime(interNumberPress,"NumberPress", function(){
							if(slideAutoTo == 'standard')
								loadPrevOnNumber();
							if(slideAutoTo == 'reverse')
								loadNextOnNumber();
								
							if(tiktakslide == true)
							{
								if(slide == 'vertical')
									slide = 'horizontal';
								else
									slide = 'vertical';
							}
						});
					}
					else if($iNumber > jCurrent)
					{
						interNumberPress = jQuery.timer.timeParse(slidespeed+10);
			
						$(document).everyTime(interNumberPress,"NumberPress", function(){
							if(slideAutoTo == 'standard')
								loadNextOnNumber();
							if(slideAutoTo == 'reverse')
								loadPrevOnNumber();
								
							if(tiktakslide == true)
							{
								if(slide == 'vertical')
									slide = 'horizontal';
								else
									slide = 'vertical';
							}
						});
					}
					
				}
			});
			
			jFrame.live("mouseenter", function(){
				if(jAnimationProgress == false)
					jAnimationStop = true;
			})
			jFrame.live("mouseleave",function(){
				if(jAnimationProgress == false)
					jAnimationStop = false;
			});
			
		}
		
		function loadNext()
		{
			jAnimationProgress = true;
			total = jTotalWrap - 1;
			
			current = jCurrent;
			if(jCurrent == total)
			{
				jCurrent = 0;
			}
			else
			{
				jCurrent++;
			}
			
			//Kijken of de animatie aanstaat
			if(doAnimation == true)
			{
				setSlideDefaultStyle();
				jBannerWrap.eq(current).css('display' , 'block');
				//Animatie Horizontaal sliden
				if(slide == 'horizontal')
				{
					jBannerWrap.eq(jCurrent).css({'right' : bannerWrap_width, 'display' : 'block'});
					jBannerWrap.eq(current).animate({'right': '-='+bannerWrap_width}, 
					{
						duration: slidespeed,  
						complete : function (){
							jBannerWrap.eq(current).css({'right' : 0, 'display' : 'none'});
						}
					});							
					jBannerWrap.eq(jCurrent).animate({'right': 0}, {duration: slidespeed, complete : function(){ jAnimationProgress = false}});
				}
				//Animatie verticaal sliden
				else if(slide == 'vertical')
				{
					jBannerWrap.eq(jCurrent).css({'top' : bannerWrap_height, 'display' : 'block'});
					jBannerWrap.eq(current).animate({'top': '-='+bannerWrap_height}, 
					{
						duration: slidespeed,  
						complete : function (){
							jBannerWrap.eq(current).css({'top' : 0, 'display' : 'none'});
						}
					});							
					jBannerWrap.eq(jCurrent).animate({'top': 0}, {duration: slidespeed, complete : function(){ jAnimationProgress = false}});
				}
			}
			//geen animatie
			else
			{
				//Hiden en showen
				jBannerWrap.hide().eq(jCurrent).show(); 
				jAnimationProgress = false;
			}
			
			setActive();

		}
		
		function loadPrev()
		{
			jAnimationProgress = true;
			total = jTotalWrap - 1;
			
			current = jCurrent;
			if(jCurrent == 0)
			{
				jCurrent = total;
			}
			else
			{
				jCurrent--;
			}
			
			//Kijken of de animatie aanstaat
			if(doAnimation == true)
			{
				setSlideDefaultStyle();
				jBannerWrap.eq(current).css('display' , 'block');
				//Animatie Horizontaal sliden
				if(slide == 'horizontal')
				{
					
					jBannerWrap.eq(jCurrent).css({'left' : bannerWrap_width, 'display' : 'block'});
					jBannerWrap.eq(current).animate({'left': '-='+bannerWrap_width}, 
					{
						duration: slidespeed,  
						complete : function (){
							jBannerWrap.eq(current).css({'left' : 0, 'display' : 'none'});
						}
					});							
					jBannerWrap.eq(jCurrent).animate({'left': 0}, {duration: slidespeed, complete : function(){ jAnimationProgress = false}});
				}
				//Animatie verticaal sliden
				else if(slide == 'vertical')
				{
					jBannerWrap.eq(jCurrent).css({'bottom' : bannerWrap_height, 'display' : 'block'});
					jBannerWrap.eq(current).animate({'bottom': '-='+bannerWrap_height}, 
					{
						duration: slidespeed,   
						complete : function (){
							jBannerWrap.eq(current).css({'bottom' : 0, 'display' : 'none'});
						}
					});							
					jBannerWrap.eq(jCurrent).animate({'bottom': 0}, {duration: slidespeed, complete : function(){ jAnimationProgress = false}});
				}
			}
			//geen animatie
			else
			{
				//Hiden en showen
				jBannerWrap.hide().eq(jCurrent).show(); 
				jAnimationProgress = false;
			}
			
			setActive();
		}
		
		function setActive()
		{
			
			sActive = numberprefix+jCurrent;
			jNumberButton.removeClass('slideractive');
			$('#'+sActive).addClass('slideractive');
			jBannerWrap.removeClass('slideractive');			
			jBannerWrap.eq(jCurrent).addClass('slideractive');			
		}
		
		function loadNextOnNumber()
		{
			if(jClickNumber == jCurrent)
			{
				$(document).stopTime("NumberPress");
				setSlideInterval();
			}
			else
			{
				loadNext();
			}
		}
		
		function loadPrevOnNumber()
		{
			if(jClickNumber == jCurrent)
			{
				$(document).stopTime("NumberPress");
				setSlideInterval();
			}
			else
			{
				loadPrev();
			}
		}
		
		process();
		
		
	}
	
});

//INTERVAL SETTER ADVANCED

jQuery.fn.extend({
	everyTime: function(interval, label, fn, times, belay) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times, belay);
		});
	},
	oneTime: function(interval, label, fn) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, 1);
		});
	},
	stopTime: function(label, fn) {
		return this.each(function() {
			jQuery.timer.remove(this, label, fn);
		});
	}
});

jQuery.event.special

jQuery.extend({
	timer: {
		global: [],
		guid: 1,
		dataKey: "jQuery.timer",
		regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
		powers: {
			// Yeah this is major overkill...
			'ms': 1,
			'cs': 10,
			'ds': 100,
			's': 1000,
			'das': 10000,
			'hs': 100000,
			'ks': 1000000
		},
		timeParse: function(value) {
			if (value == undefined || value == null)
			return null;
			var result = this.regex.exec(jQuery.trim(value.toString()));
			if (result[2]) {
				var num = parseFloat(result[1]);
				var mult = this.powers[result[2]] || 1;
				return num * mult;
			} else {
				return value;
			}
		},
		add: function(element, interval, label, fn, times, belay) {
			var counter = 0;
			
			if (jQuery.isFunction(label)) {
				if (!times)
				times = fn;
				fn = label;
				label = interval;
			}

			interval = jQuery.timer.timeParse(interval);

			if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
			return;
			
			if (times && times.constructor != Number) {
				belay = !!times;
				times = 0;
			}

			times = times || 0;
			belay = belay || false;

			var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});

			if (!timers[label])
			timers[label] = {};

			fn.timerID = fn.timerID || this.guid++;

			var handler = function() {
				if (belay && this.inProgress)
				return;
				this.inProgress = true;
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
				jQuery.timer.remove(element, label, fn);
				this.inProgress = false;
			};

			handler.timerID = fn.timerID;

			if (!timers[label][fn.timerID])
			timers[label][fn.timerID] = window.setInterval(handler,interval);

			this.global.push( element );
			
			
		},
		remove: function(element, label, fn) {
			var timers = jQuery.data(element, this.dataKey), ret;

			if ( timers ) {

				if (!label) {
					for ( label in timers )
					this.remove(element, label, fn);
				} else if ( timers[label] ) {
					if ( fn ) {
						if ( fn.timerID ) {
							window.clearInterval(timers[label][fn.timerID]);
							delete timers[label][fn.timerID];
						}
					} else {
						for ( var fn in timers[label] ) {
							window.clearInterval(timers[label][fn]);
							delete timers[label][fn];
						}
					}

					for ( ret in timers[label] ) break;
					if ( !ret ) {
						ret = null;
						delete timers[label];
					}
				}

				for ( ret in timers ) break;
				if ( !ret )
				jQuery.removeData(element, this.dataKey);
			}
		}
	}
});

jQuery(window).bind("unload", function() {
	jQuery.each(jQuery.timer.global, function(index, item) {
		jQuery.timer.remove(item);
	});
});

