// Extra Buttons Script (c)2011 John Davenport Scheuer
// as first seen in http://www.dynamicdrive.com/forums/
// add on for Ultimate Fade In Slideshow
// username: jscheuer1 - This Notice Must Remain for Legal Use
jQuery.extend(fadeSlideShow.prototype, {
	paginateinit:function($){ // replaces native paginate function
		var slideshow=this
		var setting=this.setting
		if (setting.togglerid){ //if toggler div defined
			setting.$togglerdiv=$("#"+setting.togglerid+", ."+setting.togglerid); // add togglerid as a class to allow multiple cotrol divs
			setting.$prev=setting.$togglerdiv.find('.prev').data('action', 'prev')
			setting.$next=setting.$togglerdiv.find('.next').data('action', 'next')
			setting.$status=setting.$togglerdiv.find('.status')
			this.extrabuttons($); //invoke the extra buttons function
		}
		var show = this.showslide;
		this.showslide = function(keyword){ // extend native showslide function to provide an onbeforeslide callback function
			var idx = keyword === 'next'? (setting.curimage + 1) % setting.imagearray.length : keyword === 'prev'?
				(setting.curimage - 1 + setting.imagearray.length) % setting.imagearray.length : keyword;
			if (setting.onbeforeslide && (setting.displaymode.type !== "auto" || (!setting.ismouseover && setting.currentstep<=setting.totalsteps))){
				try{setting.onbeforeslide.call(this, idx);}catch(e){
					alert('Fade In Slideshow error: An error has occured somwhere in your code attached to the "onbeforeslide" event: ' + e);
				}
			}
			show.call(this, keyword);
		};
	},
	extrabuttons: function($){
		var eb = this.setting.extrabuttons = this.setting.extrabuttons || {},
		pend = eb.pend || null, pause = eb.pause || null, slideshow = this, setting = this.setting,
		dm = setting.displaymode, ims = setting.imagearray.length, lastdm,
		$tog = setting.$togglerdiv, $nav, $buts, pauseplay, $stopbut, $gobut, navbut, i = 0,
		nav = function(num){
			if(pause && (dm.type === 'auto' || lastdm === 'auto')){ // if an extrabuttons.pause value is set later resume if show was in auto mode
				clearTimeout(setting.playtimer);
				clearTimeout(slideshow.resumetimer);
				lastdm = 'auto';
				slideshow.resumetimer = setTimeout(function(){setting.playtimer = setTimeout(resume, pause);}, setting.fadeduration + 100);
			} else if (!pause && dm.type === 'auto'){ // else if combo pause/play button toggle its appearance
				pauseplayswitch('paused');
				lastdm = 'manual';
			}
			slideshow.navigate(num); // navigate to the slide
		},
		stop = function(e){ // function for stop button
			e.preventDefault();
			slideshow.navigate(setting.imgindex);
			lastdm = 'manual';
			pauseplayswitch('paused'); // if combo pause/play button toggle its appearance
		},
		resume = function(e){
			if(e && e.preventDefault){e.preventDefault();}
			if(dm.type !== 'auto'){
				dm.type = 'auto';
				slideshow.showslide('next');
				pauseplayswitch('running');
			}
		},
		pauseplayfunc = function(e){
			e.preventDefault();
			clearTimeout(setting.playtimer);
			if($(this).hasClass('running')){
				stop(e);
			} else {
				resume();
			}
		},
		pauseplayswitch = function(state){
			var cstate = state === 'paused'? 'running' : 'paused';
			if(eb.pauseplay && $tog.find('.pauseplay').hasClass(cstate)){
				$tog.find('.pauseplay').each(function(){$(this).replaceWith(pauseplay[state].clone().remove());});
				$tog.find('.pauseplay').unbind('click', pauseplayfunc).click(pauseplayfunc);
			}
		};
		if(pend){
			if(eb.pauseplay){
				pauseplay = {running: $(setting.running || '<input type="button" value="Pause" />').addClass('pauseplay running'),
					paused: $(setting.paused || '<input type="button" value="Play" />').addClass('pauseplay paused')};
			} else {
				$stopbut = dm.type === 'auto' || dm.wraparound? $(setting.stopbut || '<input type="button" value="Stop" />').addClass('stop') : '';
				$gobut = dm.type === 'auto' || dm.wraparound? $(setting.gobut || '<input type="button" value="Go" />').addClass('resume') : '';
			}
			navbut = setting.navbut || '<input type="button" value="%c" />';
			$buts = $('<span class="extrabutspan"></span>').append(eb.pauseplay? (dm.type === 'auto'? pauseplay.running : pauseplay.paused) : $stopbut);
			for(i; i < ims; ++i){
				$buts.append(function(){
					return $(navbut.replace(/(%i)|(%c)/g, function(m){
						return m === '%c'? i + 1 : i;
					})).addClass('navbut');
				});
			}
			$buts.append(eb.pauseplay? '' : $gobut);
		} else if ($tog.find('.pauseplay.paused').size() && $tog.find('.pauseplay.running').size()){
			eb.pauseplay = true;
			pauseplay = {running: $tog.find('.pauseplay.running').eq(0).clone(),
			paused: $tog.find('.pauseplay.paused').eq(0).clone()};
			pauseplayswitch(dm.type === 'auto'? 'running' : 'paused');
		}
		$nav = (/^(append)|(prepend)$/.test(pend)? $tog[pend]($buts) : pend? $tog.find(pend).append($buts).end() : $tog)
			.find('.stop').click(stop).end()
			.find('.resume').click(resume).end()
			.find('.pauseplay').click(pauseplayfunc).end()
			.find('.navbut').click(function(e){
				e.preventDefault();
				nav(this.getAttribute('data-index') || ($nav.index(this) % ims));
			});
		setting.$prev.add(setting.$next).click(function(e){ //assign click behavior to prev and next controls
			e.preventDefault();
			var $target = $(this);
			if(eb.nextprevresume !== false){
				nav($target.data('action'));
			} else {
				if(dm.type === 'auto' || lastdm === 'auto'){
					pauseplayswitch('paused');
				}
				slideshow.navigate($target.data('action'));
				lastdm = 'manual';
			}
		});
	}
});
