/*
 * The MIT License
 * 
 * Copyright (c) 2008-2009 Olle Törnström studiomediatech.com
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/**
 * Very simple image time based image slideshow.
 *
 * Simple to use on an image element, for example:
 *
 * <img src="myStartImage.jpg" alt="" id="slideMe" />
 *
 * $('#slideMe').Slides({images : ['image1.jpg', 'image2.jpg']});
 *
 * Will rotate over the images in the passed images array.
 *
 * $('#slideMe').Slides({images : [...], pause : 6000, fade : 3000});
 *
 * Will set the pause time on each slide to 6s and the fade
 * transition time to 3s.
 *
 * Default values are 6s and 1s.
 *
 * @author Olle Törnström olle[at]studiomediatech[dot]com
 * @since 2009-01-15
 * @version 1.1.0-ALPHA
 *
 * @author Emil Bengtsson emil0r[at]gmail[dot]com
 * @added urls and functions functionality
 */
;(function($) {

	var settings = {};
	var resource = null;

	$.fn.Slides = function(options) {
		var finals = {};
		$.fn.Slides.setup(finals, $.fn.Slides.defaults, options);
		var that = this;
		resource = that;
		$.fn.Slides.init(this, function() {
			return that.each(function() {
				$(that).Slides.execute();
			});
		});
	};

	$.fn.Slides.defaults = {
		pause : 4000,
		fade : 1000,
		dir : 1
	};

	$.fn.Slides.setup = function(finals, defaults, options) {
		settings = $.extend({}, finals || {}, defaults || {}, options || {});
	};

	$.fn.Slides.init = function(target, callback) {
		if (typeof settings.images === 'undefined')
			throw Error('Image array is not optional must be passed in the call $("#id").Slides({images : ["img1.jpg", "img2.jpg"]})');
		if (typeof settings.urls != 'undefined')
		    if (settings.urls.length != settings.images.length)
		        throw Error('Urls length must match images length');
		if (typeof settings.functions != 'undefined')
		    if (settings.functions.length != settings.images.length)
		        throw Error('Functions length must match images length');
		settings.main = $(target);
		settings.pipes = new Object();
		settings.pipes.urls = new Array();
		settings.pipes.functions = new Array();
	settings.slideIndex=0;
	settings.isToggle = false;
	settings.imageCount = settings.images.length;

var initialLink = $(settings.linkID).attr('href');
	      if(initialLink && initialLink != '') {
		      if($.browser.msie && (Number($.browser.version)==7 || (document.documentMode&&document.documentMode==7))) {
			$(settings.linkID).css('cursor','hand');
			settings.main.click(function() {location.href = initialLink;});
		   }
	   }

	settings.baseImages = [];
	      for(var i=0; i<settings.imageCount;i++){
		settings.baseImages.push(settings.images[i]);
	   }

		var isInit = false;
		var initWrapper = function() {
			isInit = true;
			settings.toggle = settings.main.wrap('<span></span>')
					.parent()
					.css({display : 'block', overflow : 'hidden', height : settings.main.height() + 'px', width : settings.main.width() + 'px'});
			$.fn.Slides.preloadImage(settings.dir);
		};
		settings.main.load(function() {
		      if (!isInit){
			initWrapper();
			callback.call();
		   }
		});

		$('#'+settings.controls.jump+'-'+settings.slideIndex).addClass('current');
		$('.'+settings.controls.state).click($.fn.Slides.changeState);
		$('.'+settings.controls.change).click($.fn.Slides.change);
		$('.'+settings.controls.jump).click($.fn.Slides.jumpTo);
	};

	$.fn.Slides.changeState = function() {
	      if($(this).hasClass('pause')) {clearInterval(settings.loopSlides); $(this).removeClass('pause').addClass('play');}
	      else if($(this).hasClass('play')) {resource.Slides.execute(true); $(this).removeClass('play').addClass('pause'); settings.dir=1;}
	}

	$.fn.Slides.change = function() {
	var currentSlideIndex = Number($('.'+settings.controls.jump+'.current').attr('id').replace(new RegExp(settings.controls.jump+'-'),''));
	var isPrevious = $(this).hasClass('prev');
	var isNext = $(this).hasClass('next');
//window.alert(currentSlideIndex + '\n' + isPrevious + '\n' + isNext);
	      if(currentSlideIndex == 0 && isPrevious) {slideIndex = settings.imageCount-1;}
	      else if(currentSlideIndex == (settings.imageCount-1) && isNext) {slideIndex = 0}
	      else if(isNext) {slideIndex = currentSlideIndex+1;}
	      else if(isPrevious) {slideIndex = currentSlideIndex-1;}
//window.alert(slideIndex);
		$.fn.Slides.jumpTo(null, slideIndex);
	}

	$.fn.Slides.jumpTo = function(evt, slideIndex) {
	clearInterval(settings.loopSlides);
	$('.'+settings.controls.state).removeClass('pause').addClass('play');
	   if(slideIndex==null || slideIndex==undefined){slideIndex = $(this).attr('id').replace(new RegExp(settings.controls.jump+'-'),'');}
	      for(var i=0;i<settings.imageCount;i++){
		   if(settings.images[i] == settings.baseImages[slideIndex]){slideIndex = i; break;}
	   }
//window.alert(slideIndex);
		$.fn.Slides.preloadImage(slideIndex, $.fn.Slides.changeSlide);
	}

	$.fn.Slides.preloadImage = function(slideShift, callback) {
	      if(slideShift){
		var slideImage = $.fn.Slides.getImage(slideShift);
		var image = new Image();
		image.src = slideImage;
		settings.slideImage = image;
		      for(var i=0;i<settings.imageCount;i++){
			   if(slideImage == settings.baseImages[i]){settings.slideIndex = i+1; break;}
		   }
		   if(settings.slideIndex == settings.imageCount){settings.slideIndex=0;}
	   }
	      if(callback) {callback.call(null,true);}
	};

	$.fn.Slides.getImage = function(slideShift) {
	   if(settings.urls) {settings.pipes.urls.push(settings.urls.cycle(settings.dir,slideShift));}
	   if(settings.functions) {settings.pipes.functions.push(settings.functions.cycle(settings.dir,slideShift));}
		return settings.images.cycle(settings.dir,slideShift);
	}

	$.fn.Slides.execute = function(exec) {
	      if(exec) {$.fn.Slides.changeSlide();}
		settings.loopSlides = setInterval($.fn.Slides.changeSlide, settings.pause);
	};

	$.fn.Slides.changeSlide = function() {
		$('.'+settings.controls.jump).removeClass('current');
		$('#'+settings.controls.jump+'-'+(settings.slideIndex)).addClass('current');
		if (settings.isToggle) {
			settings.main.attr('src', settings.slideImage.src).animate({opacity : 1}, settings.fade);
			settings.isToggle = false;
		} else {
			settings.toggle.css({background : 'transparent url(' + settings.slideImage.src + ') left top no-repeat'});
			settings.main.animate({opacity : 0}, settings.fade);
			settings.isToggle = true;
		}

	if (settings.pipes.urls.length > 0) {var slideLink = settings.pipes.urls.shift();}
	if(slideLink != "") {
		$(settings.linkID).attr('href',slideLink);
	      if($.browser.msie && (Number($.browser.version)==7 || (document.documentMode&&document.documentMode==7))) {
		$(settings.linkID).css('cursor','hand');
		settings.main.click(function() {location.href = slideLink;});
	   }
	} else {$(settings.linkID).removeAttr('href');}
	if (settings.pipes.functions.length > 0) {settings.pipes.functions.shift()();}
		$.fn.Slides.preloadImage(settings.dir);
	}


Array.prototype.cycle=function(dir, loops){
var Element=null;
      if(dir){
	Element=this.shift();
	this.push(Element);
   } else {
	Element=this.pop();
	this.unshift(Element);
   }
      if(loops>1) {Element = this.cycle(dir, --loops);}
	return Element;
}

})(jQuery);

