/*
* Slides, A Slideshow Plugin for jQuery
* Intructions: http://slidesjs.com
* By: Nathan Searles, http://nathansearles.com
* Version: 1.1.6
* Updated: March 23th, 2011
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

(function($) {
	$.fn.slides=function(g) {
		g=$.extend( {
		}
		,$.fn.slides.option,g);
		return this.each(function() {
			$('.'+g.container,$(this)).children().wrapAll('<div class="slides_control"/>');
			var d=$(this),control=$('.slides_control',d),total=control.children().size(),width=control.children().outerWidth(),height=control.children().outerHeight(),start=g.start-1,effect=g.effect.indexOf(',')<0?g.effect:g.effect.replace(' ','').split(',')[0],paginationEffect=g.effect.indexOf(',')<0?effect:g.effect.replace(' ','').split(',')[1],next=0,prev=0,number=0,current=0,loaded,active,clicked,position,direction,imageParent,pauseTimeout,playInterval;
			function animate(a,b,c) {
				if(!active&&loaded) {
					active=true;
					g.animationStart(current+1);
					switch(a) {
						case'next':prev=current;
						next=current+1;
						next=total===next?0:next;
						position=width*2;
						a=-width*2;
						current=next;
						break;
						case'prev':prev=current;
						next=current-1;
						next=next===-1?total-1:next;
						position=0;
						a=0;
						current=next;
						break;
						case'pagination':next=parseInt(c,10);
						prev=$('.'+g.paginationClass+' li.current a',d).attr('href').match('[^#/]+$');
						if(next>prev) {
							position=width*2;
							a=-width*2
						} else {
							position=0;
							a=0
						}
						current=next;
						break
					}
					if(b==='fade') {
						if(g.crossfade) {
							control.children(':eq('+next+')',d).css( {
								zIndex:10
							}
							).fadeIn(g.fadeSpeed,g.fadeEasing,function() {
								if(g.autoHeight) {
									control.animate( {
										height:control.children(':eq('+next+')',d).outerHeight()
									}
									,g.autoHeightSpeed,function() {
										control.children(':eq('+prev+')',d).css( {
											display:'none',zIndex:0
										}
										);
										control.children(':eq('+next+')',d).css( {
											zIndex:0
										}
										);
										g.animationComplete(next+1);
										active=false
									}
									)
								} else {
									control.children(':eq('+prev+')',d).css( {
										display:'none',zIndex:0
									}
									);
									control.children(':eq('+next+')',d).css( {
										zIndex:0
									}
									);
									g.animationComplete(next+1);
									active=false
								}
							}
							)
						} else {
							control.children(':eq('+prev+')',d).fadeOut(g.fadeSpeed,g.fadeEasing,function() {
								if(g.autoHeight) {
									control.animate( {
										height:control.children(':eq('+next+')',d).outerHeight()
									}
									,g.autoHeightSpeed,function() {
										control.children(':eq('+next+')',d).fadeIn(g.fadeSpeed,g.fadeEasing)
									}
									)
								} else {
									control.children(':eq('+next+')',d).fadeIn(g.fadeSpeed,g.fadeEasing,function() {
										if($.browser.msie) {
											$(this).get(0).style.removeAttribute('filter')
										}
									}
									)
								}
								g.animationComplete(next+1);
								active=false
							}
							)
						}
					} else {
						control.children(':eq('+next+')').css( {
							left:position,display:'block'
						}
						);
						if(g.autoHeight) {
							control.animate( {
								left:a,height:control.children(':eq('+next+')').outerHeight()
							}
							,g.slideSpeed,g.slideEasing,function() {
								control.css( {
									left:-width
								}
								);
								control.children(':eq('+next+')').css( {
									left:width,zIndex:5
								}
								);
								control.children(':eq('+prev+')').css( {
									left:width,display:'none',zIndex:0
								}
								);
								g.animationComplete(next+1);
								active=false
							}
							)
						} else {
							control.animate( {
								left:a
							}
							,g.slideSpeed,g.slideEasing,function() {
								control.css( {
									left:-width
								}
								);
								control.children(':eq('+next+')').css( {
									left:width,zIndex:5
								}
								);
								control.children(':eq('+prev+')').css( {
									left:width,display:'none',zIndex:0
								}
								);
								g.animationComplete(next+1);
								active=false
							}
							)
						}
					}
					if(g.pagination) {
						$('.'+g.paginationClass+' li.current',d).removeClass('current');
						$('.'+g.paginationClass+' li:eq('+next+')',d).addClass('current')
					}
				}
			}
			function stop() {
				clearInterval(d.data('interval'))
			}
			function pause() {
				if(g.pause) {
					clearTimeout(d.data('pause'));
					clearInterval(d.data('interval'));
					pauseTimeout=setTimeout(function() {
						clearTimeout(d.data('pause'));
						playInterval=setInterval(function() {
							animate("next",effect)
						}
						,g.play);
						d.data('interval',playInterval)
					}
					,g.pause);
					d.data('pause',pauseTimeout)
				} else {
					stop()
				}
			}
			if(total<2) {
				return
			}
			if(start<0) {
				start=0
			}
			if(start>total) {
				start=total-1
			}
			if(g.start) {
				current=start
			}
			if(g.randomize) {
				control.randomize()
			}
			$('.'+g.container,d).css( {
				overflow:'hidden',position:'relative'
			}
			);
			control.children().css( {
				position:'absolute',top:0,left:control.children().outerWidth(),zIndex:0,display:'none'
			}
			);
			control.css( {
				position:'relative',width:(width*3),height:height,left:-width
			}
			);
			$('.'+g.container,d).css( {
				display:'block'
			}
			);
			if(g.autoHeight) {
				control.children().css( {
					height:'auto'
				}
				);
				control.animate( {
					height:control.children(':eq('+start+')').outerHeight()
				}
				,g.autoHeightSpeed)
			}
			if(g.preload&&control.find('img').length) {
				$('.'+g.container,d).css( {
					background:'url('+g.preloadImage+') no-repeat 50% 50%'
				}
				);
				var f=control.find('img:eq('+start+')').attr('src')+'?'+(new Date()).getTime();
				if($('img',d).parent().attr('class')!='slides_control') {
					imageParent=control.children(':eq(0)')[0].tagName.toLowerCase()
				} else {
					imageParent=control.find('img:eq('+start+')')
				}
				control.find('img:eq('+start+')').attr('src',f).load(function() {
					control.find(imageParent+':eq('+start+')').fadeIn(g.fadeSpeed,g.fadeEasing,function() {
						$(this).css( {
							zIndex:5
						}
						);
						$('.'+g.container,d).css( {
							background:''
						}
						);
						loaded=true;
						g.slidesLoaded()
					}
					)
				}
				)
			} else {
				control.children(':eq('+start+')').fadeIn(g.fadeSpeed,g.fadeEasing,function() {
					loaded=true;
					g.slidesLoaded()
				}
				)
			}
			if(g.bigTarget) {
				control.children().css( {
					cursor:'pointer'
				}
				);
				control.children().click(function() {
					animate('next',effect);
					return false
				}
				)
			}
			if(g.hoverPause&&g.play) {
				control.bind('mouseover',function() {
					stop()
				}
				);
				control.bind('mouseleave',function() {
					pause()
				}
				)
			}
			if(g.generateNextPrev) {
				$('.'+g.container,d).after('<a href="#" class="'+g.prev+'">Prev</a>');
				$('.'+g.prev,d).after('<a href="#" class="'+g.next+'">Next</a>')
			}
			$('.'+g.next,d).click(function(e) {
				e.preventDefault();
				if(g.play) {
					pause()
				}
				animate('next',effect)
			}
			);
			$('.'+g.prev,d).click(function(e) {
				e.preventDefault();
				if(g.play) {
					pause()
				}
				animate('prev',effect)
			}
			);
			if(g.generatePagination) {
				d.append('<ul class='+g.paginationClass+'></ul>');
				control.children().each(function() {
					$('.'+g.paginationClass,d).append('<li><a href="#'+number+'">'+(number+1)+'</a></li>');
					number++
				}
				)
			} else {
				$('.'+g.paginationClass+' li a',d).each(function() {
					$(this).attr('href','#'+number);
					number++
				}
				)
			}
			$('.'+g.paginationClass+' li:eq('+start+')',d).addClass('current');
			$('.'+g.paginationClass+' li a',d).click(function() {
				if(g.play) {
					pause()
				}
				clicked=$(this).attr('href').match('[^#/]+$');
				if(current!=clicked) {
					animate('pagination',paginationEffect,clicked)
				}
				return false
			}
			);
			$('a.link',d).click(function() {
				if(g.play) {
					pause()
				}
				clicked=$(this).attr('href').match('[^#/]+$')-1;
				if(current!=clicked) {
					animate('pagination',paginationEffect,clicked)
				}
				return false
			}
			);
			if(g.play) {
				playInterval=setInterval(function() {
					animate('next',effect)
				}
				,g.play);
				d.data('interval',playInterval)
			}
		}
		)
	}
	;
	$.fn.slides.option= {
		preload:false,preloadImage:'/images/loading.gif',container:'slides_container',generateNextPrev:false,next:'next',prev:'prev',pagination:true,generatePagination:true,paginationClass:'pagination',fadeSpeed:350,fadeEasing:'',slideSpeed:350,slideEasing:'',start:1,effect:'slide',crossfade:false,play:0,pause:0,hoverPause:false,autoHeight:false,autoHeightSpeed:350,bigTarget:false,animationStart:function() {
		}
		,animationComplete:function() {
		}
		,slidesLoaded:function() {
		}
	}
	;
	$.fn.randomize=function(c) {
		function randomizeOrder() {
			return(Math.round(Math.random())-0.5)
		}
		return($(this).each(function() {
			var $this=$(this);
			var $children=$this.children();
			var a=$children.length;
			if(a>1) {
				$children.hide();
				var b=[];
				for (i=0;i<a;i++) {
					b[b.length]=i
				}
				b=b.sort(randomizeOrder);
				$.each(b,function(j,k) {
					var $child=$children.eq(k);
					var $clone=$child.clone(true);
					$clone.show().appendTo($this);
					if(c!==undefined) {
						c($child,$clone)
					}
					$child.remove()
				}
				)
			}
		}
		))
	}
}
)(jQuery);
