/*

*/
/**
 * jQuery.timers - Timer abstractions for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/02/08
 *
 * @author Blair Mitchelmore
 * @version 1.1.2
 *
 **/

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);
	});
});


(function($){
 $.fn.TFFslide = function(options) {
    
	var defaults = {  
		data: {}, //{thumb, image, caption}
		autostart: false,
		duration: 7000,
		imageWidth:480,
		imageHeight:270,
		thumbWidth:100,
		thumbHeight:56,
		image:	'TFF_image_frame',
		thumb:	'TFF_thumb_frame',
		title:	'TFF_title',
		play:	'TFF_play',
		prev:	'TFF_prev',
		next:	'TFF_next',
		thumbClass: 'TFF_thumb',
		transition: 'fade'
		};     

	var options = $.extend(defaults, options);  
	
	var container = $(this);

	//create thumb container
	thumbFrame = $('#'+options.thumb);
	thumbContainer = $(document.createElement('div')).attr('id',options.thumb+"_container");
	thumbFrame.append(thumbContainer);

	//create image container
	imgFrame = $('#'+options.image);
	imgContainer = $(document.createElement('div')).attr('id',options.image+"_container");
	imgBackContainer = $(document.createElement('div')).attr('id',options.image+"_back_container");
	
	imgFrame.append(imgContainer).append(imgBackContainer);
	
	//load data
	numel = 0;
	for(i in options.data){
		//var thumb = $(document.createElement('img')).attr('src',options.data[i].thumb);
		
		
		var div = $(document.createElement('div')).attr('id','image-'+i).addClass(options.thumbClass).css({'background':"#000 url('"+options.data[i].thumb+"') no-repeat center center"}).attr('slot',numel).attr('image_id',i);
		jQuery(thumbContainer).append(div);
		
		//var img = $(document.createElement('img')).attr('src',options.data[i].image);
		
		div = $(document.createElement('div')).attr('id','imagebig-'+i).addClass('TFF_slide').css({'background':"#000 url('"+options.data[i].image+"') no-repeat center center"});
		jQuery(imgContainer).append(div);
		numel++;
	}
	
	maxwidth = (options.thumbWidth+16)*numel+2;
	center = Math.round((options.imageWidth-options.thumbWidth)/2);
	jQuery(thumbContainer).css('width',maxwidth+'px').css('left',center+'px');
	
	maxwidth = (options.imageWidth)*numel;
	jQuery(imgContainer).css('width',maxwidth+'px');
	
	//START
	var slot = 0;
	$('.'+options.thumbClass+':eq('+slot+')').css('border','1px solid #fff');
	var p = $(document.createElement('P')).text(options.data[$('.'+options.thumbClass+':eq('+slot+')').attr('image_id')].caption);
	$('#'+options.title).html(p);		


	//CLICK
	$('.'+options.thumbClass).click(function(){
		$(this).blur();
		var prev_obj = $('.'+options.thumbClass+':eq('+slot+')');
		var obj = $(this);
		slot = $(this).attr('slot');
		transition(obj,prev_obj,options);
		$('.'+options.play).addClass('TFF_play_disabled');
		jQuery(document).stopTime();
	});


	//NEXT
	$('#'+options.next).click(function(){
		
		$(this).blur();

		var prev_obj = $('.'+options.thumbClass+':eq('+slot+')');

		if(slot<numel-1)slot++;
		else slot=0;

		var obj = $('.'+options.thumbClass+':eq('+slot+')');
		transition(obj,prev_obj,options);
		$('.'+options.play).addClass('TFF_play_disabled');
		jQuery(document).stopTime();
	});

	//PREV
	$('#'+options.prev).click(function(){
		$(this).blur();
		var prev_obj = $('.'+options.thumbClass+':eq('+slot+')');
		if(slot>0)slot--;
		else slot=numel-1;
		var obj = $('.'+options.thumbClass+':eq('+slot+')')

		transition(obj,prev_obj,options);
		$('.'+options.play).addClass('TFF_play_disabled');
		jQuery(document).stopTime();
	});

	

	if(options.autostart){
		jQuery(document).everyTime(6000, function(i) {
			var prev_obj = $('.'+options.thumbClass+':eq('+slot+')');
			if(slot<numel-1)slot++;
			else slot=0;
			var obj = $('.'+options.thumbClass+':eq('+slot+')');

			transition(obj,prev_obj,options);
		});
		$('.'+options.play).toggle(
		function(){
			$(this).addClass('TFF_play_disabled');
			jQuery(document).stopTime();
		},
		function(){
			$(this).removeClass('TFF_play_disabled');
			jQuery(document).everyTime(6000, function(i) {
				var prev_obj = $('.'+options.thumbClass+':eq('+slot+')');
				if(slot<numel-1)slot++;
				else slot=0;
				var obj = $('.'+options.thumbClass+':eq('+slot+')');

				transition(obj,prev_obj,options);
				});
		});
	}
	else{
		
		$('.'+options.play).addClass('TFF_play_disabled');
		jQuery(document).stopTime();
		
		$('.'+options.play).toggle(
			
			function(){
				$(this).removeClass('TFF_play_disabled');
				jQuery(document).everyTime(6000, function(i) {
					var prev_obj = $('.'+options.thumbClass+':eq('+slot+')');
					if(slot<numel-1)slot++;
					else slot=0;
					var obj = $('.'+options.thumbClass+':eq('+slot+')');

					transition(obj,prev_obj,options);
				});
			},
			function(){
				$(this).addClass('TFF_play_disabled');
				jQuery(document).stopTime();
			}
		);
	}
	//set events prev,next,cycle


	//next function
	//prev function
	//select function
	//timer function

	};  
function transition(obj,prev_obj,options){

	$('.'+options.thumbClass).css('border','none');
	obj.css('border','1px solid #fff');
	jQuery(thumbContainer).stop().animate({left:(center-(options.thumbWidth+16)*obj.attr('slot')+2)+'px'},500);
	
	if(options.transition == 'slide')
		jQuery(imgContainer).stop().animate({left:(-(options.imageWidth)*obj.attr('slot'))+'px'},500);
	else{
		
	//if not fully fade in
	
		var back_img = $('#'+$(imgContainer).attr('id')+' div:eq('+prev_obj.attr('slot')+')');
		$(back_img).clone().appendTo(imgBackContainer);
		jQuery(imgContainer).stop().animate({opacity:0},0).css('left',(-(options.imageWidth)*obj.attr('slot'))+'px').animate({opacity:1},500,function(){
			$(imgBackContainer).empty();

		});		
	}
	$('#'+options.title+' p').stop().animate({opacity:0},0).text(options.data[obj.attr('image_id')].caption).animate({opacity:1},500);

}

})(jQuery);




