(function($) {
	$.fn.Slideshow = function(options) {
		var options = $.extend({}, $.fn.Slideshow.defaults, options || {});

		return $(this).each(function() {
			var slides = new Array();
			var slideCount = 1;
			var currentSlide = -1;
			var timer = null;
			var paused = false;
			var firstPlay = true;
			var $container = $(this);
			var $slides = $container.find('div.slides');
			var $buttons = $container.find('div.buttons');
			var $loading = $container.find('div.loading_bg');
			var $pauseBtn = $container.find('a.pause');
			var $slideBtns = $container.find('div.slide_buttons');
			
			var dimensions = {
				width: options.width,
				height: options.height
			};
			
			$buttons.css({
				bottom: options.buttonsBottom,
				right: options.buttonsRight
			});
			$container.css(dimensions);
			$slides.css(dimensions);
			$loading.css(dimensions);			
			
			if (options.xml == null)
				return;
	
			loadXML(options.xml);

			function buildUI() {
				for (var i = 0; i < slideCount; i++) {
					var $btn = $('<a href="#" rel="' + i + '">&nbsp;</a>');
					$btn.click(onSlideBtnClick);
					$btn.appendTo($slideBtns);
				}			

				$pauseBtn.click(onPause);
			};
			
			function onSlideBtnClick() {
				pause();
				var slideID = $(this).attr('rel');
				currentSlide = slideID;
				showSlide(slideID);
				return false;
			};
			
			function loadXML(uri) {
				$.ajax({
					url: uri, 
					dataType: "xml",
					success: function(xml) {
						slideCount = $(xml).find('item').size();
						id = 0;
						$(xml).find('item').each(function() {
							var $this = $(this);
							var link = $(this).attr('link');
							var $img = $('<img />').attr('src', $this.attr('url'))
							.attr('slide', id++).attr('link', link);

							if (link != '') {
								$img.click(function () {
									window.location = $(this).attr('link');
									return false;
								}).css('cursor', 'pointer');
							}

							$slides.append($img);
						});
						
						$slides.onImagesLoaded(function(){
							onLoad();
						});
					}
				});
			};
			
			function onLoad() {
				buildUI();
				$loading.fadeOut();
				$buttons.fadeIn();
				start();
				//$container.find('div.loading_bg').css('background', '#000');
			};

			function showSlide(slide) {
				$slides.find('img').removeClass('active');
				var $i = $slides.find('img[slide="' + slide + '"]');
				$i.addClass('active');
				var $a = $slides.find('img:not(.active)');
				$a.css("z-index", 80);	
				$i.css("z-index", 90);	
				$i.fadeIn();
				$a.fadeOut();				
				toggleBtn(slide);
			};

			function toggleBtn(slide) {
				$slideBtns.find('a').removeClass('active');
				$slideBtns.find('a[rel="' + slide + '"]').addClass('active');
			};
			
			function advance() {
				if (paused)
					return;

				currentSlide++;

				if (currentSlide == slideCount)
					currentSlide = 0;

				showSlide(currentSlide);
				timer = setTimeout(advance, options.delay);
			};
			
			function start() {
				$pauseBtn.removeClass('paused');
				paused = false;
				if (firstPlay) {
					firstPlay = false;
					toggleBtn(Math.floor(currentSlide + 1, slideCount));
					showSlide(Math.floor(currentSlide + 1, slideCount));
				}
				timer = setTimeout(advance, options.delay);
			};
			
			function pause() {
				$pauseBtn.addClass('paused');
				paused = true;
				clearTimeout(timer);
			};			
			
			function onPause() {				
				if (paused)
					start();
				else
					pause();
					
				return false;
			}
		});
	};

	$.fn.Slideshow.defaults = {
		delay: 3000,
		width: 746,
		height: 413,
		buttonsBottom: 36,
		buttonsRight: 16
	};
})(jQuery);

jQuery.fn.onImagesLoaded = function(_cb) { 
  return this.each(function() {
 
    var $imgs = (this.tagName.toLowerCase()==='img')?$(this):$('img',this),
        _cont = this,
            i = 0,
    _done=function() {
      if( typeof _cb === 'function' ) _cb(_cont);
    };
 
    if( $imgs.length ) {
      $imgs.each(function() {
        var _img = this,
        _checki=function(e) {
          if((_img.complete) || (_img.readyState=='complete'&&e.type=='readystatechange') )
          {
            if( ++i===$imgs.length ) _done();
          }
          else if( _img.readyState === undefined )
          {
            $(_img).attr('src',$(_img).attr('src'));
          }
        };
 
        $(_img).bind('load readystatechange', function(e){_checki(e);});
        _checki({type:'readystatechange'}); // bind to 'load' event...
      });
    } else _done();
  });
};
