/**
 * jQuery.geeSlider - Simple sliding gallery
 * Date: 31/01/2011
 *
 * @author Shannon Smith
 * @version 0.1
 * @jQuery Version: 1.4.4
 *
 ***************************
 * - Added paging functionality
 *
 * Copyright: GeeMultimedia
 **/

/*

var magnitude = 0;
var current_index = 0;

var li_width = 50;

onclick = function() {
	var start_index = current_index;

	var ul = $(<ul>).stop();
	var left = ul.postion().left;

	if(magnitude > 0) {
		var adjusted_index = Math.ceil(left / li_width);
		magnitude -= adjusted_index -start_index;
		current_index = adjusted_index;
	}
	else if(magnitude < 0) {
		var adjusted_index = Math.floor(left / li_width);
		magnitude += adjusted_index -start_index;
		current_index = adjusted_index;


		Math.floor()
	}



	magnitude++;



position magnitude from the end, position rest from current










(-left / li_width) = 



original_index = 0;
adjusted_current = 3;
magnitude = 6


magnitude = 3
current_indx = 3

magnitude = 4



Math.ceil()
math.floor()



if mag > 0 then reduce current right




l = -25
w = 50


-25 / 50 = -0.5


pos will probly be negative



}




*/

(function($){
		$.fn.geeSlider = function(options) {
				var settings = {
						effect: 'slideX',
						delay: 5000,
						duration: 1000,
						easing: 'swing',
						slider: null,
						bookmarks: null,
						wrap: false
					};
				if (options) { 
					$.extend(settings, options);
				}

				return this.each(function() {
						var $this = this;
						var hero_ul = $(settings.slider ? settings.slider : $this);

						var hero_li = $('li', hero_ul);
						var hero_outer_width = hero_li.outerWidth();
						var hero_outer_height = hero_li.outerHeight();

						var visible_count;

						if(hero_ul.is('div')) {
							visible_count = Math.floor(hero_ul.outerWidth() /hero_outer_width);
							hero_ul = hero_ul.find('ul').first();
						}
						else {
							hero_ul.wrap('<div style="position: relative; width: ' + hero_outer_width + 'px; height: ' + hero_outer_height + 'px; overflow: hidden;" />');
							visible_count = 1;
						}
						var hero_offset = hero_ul.position();

						var current_index = 0;
						var max_index = hero_li.length -1;

						var bookmarks = null;
						if(settings.bookmarks) {
							bookmarks = $(settings.bookmarks);

							bookmarks.filter('a[href="#next"]').click(function() {
									slideTo(current_index +1);
									return false;
								});
							bookmarks.filter('a[href="#prev"]').click(function() {
									slideTo(current_index -1);
									return false;
								});
							bookmarks = bookmarks.not('a[href="#next"], a[href="#prev"]');
							bookmarks.click(function() {
									var index = bookmarks.index($(this));
									if(current_index === index)
										return false;
									slideTo(index);
									if(wrapping) {
										wrapping = false;
										hero_li.first().css({
												left: '0px'
											});
									}
									return false;
								});
							bookmarks.eq(current_index).addClass('current');
						}

						switch(settings.effect) {
							case 'slideX':
								hero_ul.css({
										width: hero_li.length *hero_outer_width + 'px',
										overflow: 'hidden',
										position: 'absolute',
										left: hero_offset.left + 'px'
									});
								if(settings.wrap) {
									hero_ul.css({
											height: hero_outer_height
										});
									hero_li.each(function(index) {
											$(this).css({
													position: 'absolute',
													left: (index *hero_outer_width) + 'px'
												});
										});
								}
								break;

							case 'fade':
								var elementQueue = hero_li.get().reverse();
								$(elementQueue).css('position', 'absolute').css('z-index', function(index) {
										return index;
									});
								break;

							default:
								throw 'Unknown transition';
								break;
						}

						var int_slide = null;
						function startTimer() {
							$($this).trigger('endtransition');

							if(settings.delay)
								int_slide = setTimeout(slide, settings.delay);
						}
						function doSlide() {
							if(settings.effect == 'slideX') {

								clearTimeout(int_slide);

								$($this).trigger('begintransition');

								switch(settings.effect) {
									case 'slideX':
										hero_ul.stop().animate({
												left: (-current_index *hero_outer_width +hero_offset.left) + 'px'
											}, settings.duration, settings.easing, startTimer);
										break;

									case 'fade':
										for(var i=elementQueue.length; i--;) {
											if(elementQueue[i] === hero_li.eq(current_index).get(0)) {
												elementQueue.push(elementQueue.splice(i, 1)[0]);
												break;
											}
										}
										var ele = $(elementQueue[elementQueue.length -1]).css('opacity', '0.0');
										$(elementQueue).stop().css('z-index', function(index) {
												return index;
											});
										ele.stop().animate({
												'opacity': '1.0'
											}, settings.duration, settings.easing, startTimer);
										break;
								}
							}
							else {
								clearTimeout(int_slide);

								$($this).trigger('begintransition');

								switch(settings.effect) {
									case 'slideX':
										hero_ul.stop().animate({
												left: (-current_index *hero_outer_width +hero_offset.left) + 'px'
											}, settings.duration, settings.easing, startTimer);
										break;
									case 'fade':
										for(var i=elementQueue.length; i--;) {
											if(elementQueue[i] === hero_li.eq(current_index).get(0)) {
												elementQueue.push(elementQueue.splice(i, 1)[0]);
												break;
											}
										}
										var ele = $(elementQueue[elementQueue.length -1]).css('opacity', '0.0');
										$(elementQueue).stop().css('z-index', function(index) {
												return index;
											});
										ele.stop().animate({
												'opacity': '1.0'
											}, settings.duration, settings.easing, startTimer);
										break;
								}
							}

							bookmarks.removeClass('current');
							bookmarks.eq(current_index).addClass('current');
						}
						function slideTo(index) {
							if(settings.effect == 'slideX') {
								var isLeft = index < current_index;

								var virtual_requirement_override = 0;

								var wrap = false;
								if(index > max_index) {
									current_index = 0;
									virtual_requirement_override = 5
									if(settings.wrap && settings.effect === 'slideX') {
										wrap = true;
									}
								}
								else if(index < 0) {
									current_index = max_index;
									hero_ul.css({
											left: (-(max_index +1) * hero_outer_width) + 'px'
										});
								}
								else {
									current_index = index;
								}

								var virtual_requirement = (hero_li.length -visible_count -current_index) * -1 + (isLeft ? 1 : 0);
								if(virtual_requirement < 0) virtual_requirement = 0;

								if(virtual_requirement_override)
									virtual_requirement = virtual_requirement_override;

								hero_li.each(function(index) {
										if(index === visible_count) return false;
										$(this).css({
												position: 'absolute',
												left: (index < virtual_requirement ? ((index + hero_li.length) *hero_outer_width) : (index *hero_outer_width)) + 'px'
											});
									});

								if(wrap) {
									slideWrap();
								}
								else {
									doSlide();
								}
							}
							else {
								if((current_index = index) > max_index) {
									current_index = 0;
									if(settings.wrap && settings.effect === 'slideX') {
										return slideWrap();
									}
								}
								if(current_index < 0)
									current_index = max_index;
								doSlide();
							}
						}
						function slide() {
							if(++current_index > max_index) {
								current_index = 0;
								if(settings.wrap && settings.effect === 'slideX') {
									return slideWrap();
								}
							}
							doSlide();
						}
						function slideWrap_callback() {
							hero_li.each(function(index) {
									if(index === visible_count) return false;
									$(this).css({
											position: 'absolute',
											left: (index *hero_outer_width) + 'px'
										});
								});
							hero_ul.css({
									left: hero_offset.left + 'px'
								});	
							startTimer();
						}
						var wrapping = false;
						function slideWrap() {
							clearTimeout(int_slide);
							wrapping = true;
							var newX = max_index *hero_outer_width;

							hero_ul.stop().animate({
									left: (-(max_index +1) *hero_outer_width +hero_offset.left) + 'px'
								}, settings.duration, settings.easing, slideWrap_callback);
							bookmarks.removeClass('current');
							bookmarks.eq(current_index).addClass('current');
						}

						$($this).trigger('ready');
						if(settings.delay > 0)
							int_slide = setTimeout(slide, settings.delay);



						var current_index = 0;
						var current_magnitude = 0;


						/* SLIDE FUNCTIONS */

						/*
						Called when slide has compeleted and when slide gets called again.
						Sets current_index and adjusts positions so to put tiles in an equivalent state closer to original values.
						*/
						function compress() {
						}

						/*
						Postions tiles ready to scroll further in the desired direction. Negative if tiles are requried left, positiove if tey are required right.
						*/
						function prepareMove(magnitude) {

						}

						/*
						*/
						function moveBy(){}

/*

- magnitude gets modified during movement.
  - magnitude is capped as required
- target = current_index + magnitude


*/




				});
			};
	})(jQuery);
