/**
 * jQuery.geeFader - Simple fading gallery
 * Date: 2/03/2011
 *
 * @author Shannon Smith
 * @version 0.1
 * @jQuery Version: 1.4.4
 *
 * Copyright: GeeMultimedia
 **/
(function($){
		var defaults = {
				effect: 'fade',
				delay: 0,
				duration: 1000,
				easing: 'swing',
				hero: null,
				bookmarks: null,
				wrap: false
			};

		var methods = {
				setOption: function(key, value) {
					return this.each(function() {
							var settings = $(this).data('geeFader');
							switch(key) {
								case 'effect':
								case 'hero':
								case 'wrap':
								case 'bookmarks':
									$.error('Option ' +  key + ' may not be set after initialized' );
									break;
								case 'duration':
								case 'easing':
									settings[key] = value;
									break;
								case 'delay':
									settings[key] = value;
									clearTimeout(settings.int_slide);
									if(value > 0) {
										settings.resetTimer();
									}
									break;
								default:
									$.error('Option ' +  key + ' does not exist on jQuery.geeFader' );
									break
							}
					});
				},
				init: function(options) {
					var settings = $.extend({}, defaults, options);

					function slideTo(index) {
						if((settings.current_index = index) > settings.max_index) {
							settings.current_index = 0;
						}
						if(settings.current_index < 0)
							settings.current_index = settings.max_index;
						doSlide();
					}
					function slide() {
						if(++settings.current_index > settings.max_index) {
							settings.current_index = 0;
						}
						doSlide();
					}
					function doSlide() {
						clearTimeout(settings.int_slide);

						var current_element = settings.hero_li.eq(settings.current_index).get(0);
						for(var i=settings.elementQueue.length; i--;) {
							if(settings.elementQueue[i] === current_element) {
								settings.elementQueue.push(settings.elementQueue.splice(i, 1)[0]);
								break;
							}
						}
						switch(settings.effect) {
							case 'fade':
								var ele = $(settings.elementQueue[settings.elementQueue.length -1]).css('opacity', '0.0');
								$(settings.elementQueue).stop().css('z-index', function(index) {
										return index;
									}).removeClass('current');
								ele.addClass('current').animate({
										'opacity': '1.0'
									}, settings.duration, settings.easing, startTimer);
								break;

							case 'snap': // default is snap
							default:
								var ele = $(settings.elementQueue[settings.elementQueue.length -1]).css('display', 'none');
								$(settings.elementQueue).stop().css('z-index', function(index) {
										return index;
									}).removeClass('current');
								ele.addClass('current').css('display', 'block');
								startTimer();
								break;
						}

						$(settings.bookmarks).not('a[href="#next"], a[href="#prev"]').removeClass('current').eq(settings.current_index).addClass('current');

						if(settings.wrap != true) {
							if(settings.current_index === 0) {
								$(settings.bookmarks).filter('a[href="#prev"]').addClass('first');
							}
							else {
								$(settings.bookmarks).filter('a[href="#prev"]').removeClass('first');
							}
							if(settings.current_index === settings.max_index) {
								$(settings.bookmarks).filter('a[href="#next"]').addClass('last');
							}
							else {
								$(settings.bookmarks).filter('a[href="#next"]').removeClass('last');
							}
						}

						settings.object.trigger('begintransition');
					}
					settings.resetTimer = function() {
						if(settings.delay) {
							settings.int_slide = setTimeout(slide, settings.delay);
						}
					}
					function startTimer() {
						settings.object.trigger('endtransition');
						if(settings.delay) {
							settings.int_slide = setTimeout(slide, settings.delay);
						}
					}

					return this.each(function() {
							settings.object = $(this);

							if(! settings.object.data('geeFader')) {
								settings.object.data('geeFader', settings)
								var hero_ul = $(settings.hero ? settings.hero : this);

								var hero_outer_width, hero_outer_height;

								if(! hero_ul.is('ul, ol')) {
									hero_ul = hero_ul.find('ul').first();
									settings.hero_li = hero_ul.children();
									hero_outer_width = settings.hero_li.outerWidth();
									hero_outer_height = settings.hero_li.outerHeight();
								}
								else {
									settings.hero_li = hero_ul.children();
									hero_ul.wrap('<div style="position: relative; width: ' + hero_outer_width + 'px; height: ' + hero_outer_height + 'px; overflow: hidden;" />');
									hero_outer_width = settings.hero_li.outerWidth();
									hero_outer_height = settings.hero_li.outerHeight();
								}
								if(settings.hero_li.length < 2)
									return false;
								settings.hero_li.first().addClass('current');
								var hero_offset = hero_ul.position();

								settings.current_index = 0;
								settings.max_index = settings.hero_li.length -1;

								$(settings.bookmarks).filter('a[href="#next"]').click(function() {
										if(settings.wrap != true && $(this).is('.last'))
											return false;
										slideTo(settings.current_index +1 > settings.max_index ? 0 : settings.current_index +1);
										return false;
									});
								if(settings.wrap != true && settings.max_index === 0)
									$(settings.bookmarks).filter('a[href="#prev"]').addClass('last');

								$(settings.bookmarks).filter('a[href="#prev"]').click(function() {
										if(settings.wrap != true && $(this).is('.first'))
											return false;
										slideTo(settings.current_index -1 < 0 ? settings.max_index : settings.current_index -1);
										return false;
									});
								if(settings.wrap != true)
									$(settings.bookmarks).filter('a[href="#prev"]').addClass('first');

								$(settings.bookmarks).not('a[href="#next"], a[href="#prev"]').click(function() {
										if($(this).is('.current'))
											return false;
										slideTo($(settings.bookmarks).not('a[href="#next"], a[href="#prev"]').index($(this)));
										return false;
									}).eq(settings.current_index).addClass('current');

								settings.elementQueue = settings.hero_li.get().reverse();
								$(settings.elementQueue).css('position', 'absolute').css('z-index', function(index) {
										return index;
									});

								settings.int_slide = null;
								settings.object.trigger('ready');
								if(settings.delay > 0)
									settings.int_slide = setTimeout(slide, settings.delay);
							}
					});
				}

			};

		$.fn.geeFader = function(method) {
				if(methods[method]) {
					return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
				}
				else if(typeof method === 'object' || ! method) {
					return methods.init.apply(this, arguments)
				}
				else {
					$.error('Method ' +  method + ' does not exist on jQuery.geeFader' );
				}
			};
	})(jQuery);
