/*
 * MODIFIED 6/16/2009
 */

/*
 * 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 = {};

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

	$.fn.Slides.defaults = {
		pause : 6000,
		fade : 1000
	};

	$.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.int_id = false;
		settings.im_index = 0;
		settings.pipes = new Object();
		settings.pipes.urls = new Array();
		settings.pipes.functions = new Array();
		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.preloadNextImage();
		};
		settings.main.load(function() {
			if (isInit)
				return;
			initWrapper();
			callback.call();
		});
		if (settings.main[0].complete && !isInit) {
			initWrapper();
			callback.call();
		}
	};

	$.fn.Slides.preloadNextImage = function() {
		var nextImage = $.fn.Slides.getNextImage();
		var image = new Image();
		image.src = nextImage;
		settings.nextImage = image;
	};

	$.fn.Slides.getNextImage = function() {
	    settings.im_index++;
		if (settings.im_index >= settings.images.length) settings.im_index = 0;
		var nextImage = settings.images[settings.im_index];

		if (settings.urls)
		{
		    var url = settings.urls[settings.im_index];
		    settings.pipes.urls.push(url);
		}
		if (settings.functions)
		{
		    var func = settings.functions[settings.im_index];
		    settings.pipes.functions.push(func);
		}
		return nextImage;
	};
	
	$.fn.Slides.pause = function() {
		var pause = '/extension/site/design/site/images/button_pause.gif';
		var unpause = '/extension/site/design/site/images/button_arrow_right.gif'
		if ($('#buttonPause img').attr('src') == pause) {
			$('#buttonPause img').attr('src', unpause);
			$('#buttonPause a').css('background-color', 'red');
			clearInterval(settings.int_id);
			settings.int_id = false;
		} else {
			$('#buttonPause img').attr('src', pause);
			$('#buttonPause a').css('background-color', '');
			$.fn.Slides.execute();
		}
	}
	

	
	$.fn.Slides.to_index = function(x) {
		clearInterval(settings.int_id);
		settings.int_id = false;
		if (typeof x == 'string') {
			settings.im_index = settings.im_index + parseInt(x);
			if (settings.im_index >= settings.images.length) settings.im_index = 0;
			if (settings.im_index < 0) settings.im_index = settings.images.length -1;
		} else {
			settings.im_index = x;
		}
		
		for (var i=0;i<settings.images.length;i++) {
			var this_but = '#button' + i;
			if (i != settings.im_index) {
				$(this_but).css('background-color', '');
			} else {
				$(this_but).css('background-color', 'orange');
			}
		}
		settings.im_index = settings.im_index -1;
		$.fn.Slides.preloadNextImage();
		
		settings.main.attr('src', settings.nextImage.src).attr('tog', 0).css("opacity","1");
		isToggle = false;

		if (settings.pipes.urls.length > 0) {
			var slideLink = settings.pipes.urls.shift();
	   		if(slideLink != "") {$(settings.linkID).attr('href',slideLink);} else {$(settings.linkID).removeAttr('href');}
//                settings.main.click(function(){ window.location.href = settings.pipes.urls.shift(); });
		}
        if (settings.pipes.functions.length > 0) settings.pipes.functions.shift();

		$.fn.Slides.execute();

	}
	
	$.fn.Slides.shownow = function() {
		for (var i=0;i<settings.images.length;i++) {
			var this_but = '#button' + i;
			if (i != settings.im_index) {
				$(this_but).css('background-color', '');
			} else {
				$(this_but).css('background-color', 'orange');
			}
		}

		var isToggle = settings.main.attr('tog');
		if (isToggle == 1) {
			settings.main.attr('src', settings.nextImage.src).attr('tog', 0).animate({opacity : 1}, settings.fade);
			isToggle = false;
		} else {
			settings.toggle.css({background : 'transparent url(' + settings.nextImage.src + ') left top no-repeat'});
			settings.main.attr('tog', 1).animate({opacity : 0}, settings.fade);
			isToggle = true;
		}

	    if (typeof jslides_callback == 'function') jslides_callback(settings.im_index);
				
		if (settings.pipes.urls.length > 0) {
			var slideLink = settings.pipes.urls.shift();
	   		if(slideLink != "") {$(settings.linkID).attr('href',slideLink);} else {$(settings.linkID).removeAttr('href');}
//                settings.main.click(function(){ window.location.href = settings.pipes.urls.shift(); });
		}
        if (settings.pipes.functions.length > 0) settings.pipes.functions.shift();
		$.fn.Slides.preloadNextImage();

	}

	$.fn.Slides.execute = function() {
		if (!settings.int_id) {
			settings.int_id = setInterval( $.fn.Slides.shownow, settings.pause);
		}
	};

})(jQuery);