// JavaScript Document
(function($) {
		  
$.fn.jQuad = function(options){
	var defaults = {time:7000,controls:true,width:0,height:0,type:"all",thumbnails:false,thumbnailposition:'left',view:"normal",callback:function(){  } };
	var options = $.extend(defaults, options);
	var root = $(this);
	root.find("div").attr("id","jQuad-stage");
	
	var ul = root.find("ul:first");
	var li = ul.find("li");
	var images = li.find("img");
	 li.find("span").hide();
	 li.find("span").last().show();
	 ul.prepend("<span id='loader' style='padding:4px;width:100px;background:#000000;color:#ffffff'>Loading please wait....</span>");
	   if(options.width>0&&options.height>0)
	 {
		 proceed();
		 
	 }
	 else 
	 {
	 if($.browser.webkit) 
			 {
				 $(window).load(function(){
									
									proceed();	
										
										});						
									
			 }
			 else
				proceed();						 
	 }
										 
	
	function proceed(){
		$("#loader").remove();	
	//Declaring variables.
	var dimension = {
	height:images.height(), width:images.width()
	};	
	
	
	   if(options.width>0&&options.height>0)
	 {
		dimension = {
	height:options.height, width:options.width
	};	
		 
	 }
	
	var list_array = $.makeArray(li);
	var thumb_array,th_current;
    var image_timer,flag=false,in_flag=false;
	var thumbnails;
	//variables for transition
	var arr,index,block,trans_ch,w,h,src,parent,im;
	
	//checking options
	
		 
	 if(options.controls==true)
	controllers();
	if(options.view=="maximize")
	maximize();
	if(options.thumbnails==true&&root.find("ul").length>1)
	{
		
		thumbnails  = root.find("ul:last");
		thumbnails.attr("id","jquad-thumbnail");
		generatethumbnails(options.thumbnailposition);
	    
	}
	
	 //Reset elements
	li.css({"width":dimension.width,height:dimension.height,display:"block"});
	$("#jQuad-stage").css({"width":dimension.width,height:dimension.height});
	li.addClass('reset');
	 
	 function incrementz()
	 {
				
		var th,sr,temp =  list_array.pop();
		list_array.unshift(temp);
		if($(list_array[0]).hasClass('active'))
			$(list_array[0]).toggleClass('active reset');
			$(list_array[0]).find("span").hide();
			
			$(list_array[list_array.length-1]).toggleClass('active reset');
				$(list_array[list_array.length-1]).find("span").show();
			$(list_array[list_array.length-2].firstChild).css({display:"block",opacity:1.0});
			
		if(options.thumbnails==true){
			$(th_current).toggleClass('hover');
			
			 sr = list_array[list_array.length-1].firstChild.src;
			 if(sr.lastIndexOf('/')!=-1)
			 sr = sr.substr(sr.lastIndexOf('/')+1,sr.length-1);
			 
			for(var i=0;i<thumb_array.length;i++)
			{
				th = thumb_array[i].firstChild.src;
				if(th.lastIndexOf('/')!=-1)
				th = th.substr(th.lastIndexOf('/')+1,th.length-1);
				
				if(th==sr)
			     {
					 $(thumb_array[i]).toggleClass('hover');
				    break;
				 }
			   
			}
			th_current = thumb_array[i];
			
		}	
		  
		  if(in_flag==true)
		 {
			 in_flag = false;
			 transition();
		 }
			
		options.callback(list_array[list_array.length-1].firstChild);	
	 };
	 
	 function decrementz()
	{
	var th,sr,temp = list_array.shift();
	list_array.push(temp);
	if($(list_array[list_array.length-2]).hasClass('active'))
			$(list_array[list_array.length-2]).toggleClass('active reset');
			$(list_array[list_array.length-2]).find("span").hide();
			
			$(list_array[list_array.length-1]).toggleClass('active reset');
			$(list_array[list_array.length-1]).find("span").show();
			$(list_array[0].firstChild).css({display:"block",opacity:1.0});
			
			
		if(options.thumbnails==true){
			$(th_current).toggleClass('hover');
			 sr = list_array[list_array.length-1].firstChild.src;
			 if(sr.lastIndexOf('/')!=-1)
			 sr = sr.substr(sr.lastIndexOf('/')+1,sr.length-1);
			 
			for(var i=0;i<thumb_array.length;i++)
			{
				th = thumb_array[i].firstChild.src;
				if(th.lastIndexOf('/')!=-1)
				th = th.substr(th.lastIndexOf('/')+1,th.length-1);
				
				if(th==sr)
			     {
					 $(thumb_array[i]).toggleClass('hover');
				    break;
				 }
			   
			}
			th_current = thumb_array[i];
			
		}		
		
		options.callback(list_array[list_array.length-1].firstChild);	
	};

	 function transition()
	 {
		if(in_flag==false)
		{
			
		image_timer = setInterval(function(){
				   effects();
				},options.time);
		}
		else
		{
			effects();
			
		}
		
	 };
	 
	 function effects()
	 {
		 if(!isNaN(parseInt(options.type)) )
		trans_ch = parseInt(options.type);
		else if(options.type=="all")								   
		trans_ch = Math.floor(Math.random()* 9);
		else if(options.type=="flip")
		trans_ch = 11;
		else if(options.type=="fade")
		trans_ch = 0;
		else if(options.type=="blind")
		trans_ch = Math.ceil(Math.random()* 4);
		else if(options.type=="cube")
		trans_ch = 7 + Math.floor(Math.random()* 2) ;
		else if(options.type=="spectrum")
		trans_ch = 5 + Math.floor(Math.random()* 2) ;
		else if(options.type=="strip")
		trans_ch = 9 + Math.floor(Math.random()* 2) ;
		
		
	 
       switch(trans_ch)
			  {
				  case 0:$(list_array[list_array.length-1].firstChild).fadeOut(1500,function(){ incrementz();  }); break;
			      case 1: verticaleaseout(list_array[list_array.length-1].firstChild); break;
				  case 2: horizontaleaseout(list_array[list_array.length-1].firstChild); break;
				  case 3: verticalblind(list_array[list_array.length-1].firstChild); break;
				  case 4: horizontalblind(list_array[list_array.length-1].firstChild); break;
				  case 5: spectrumout(list_array[list_array.length-1].firstChild); break;
				  case 6: hspectrumout(list_array[list_array.length-1].firstChild); break;
				  case 7: cubescale(list_array[list_array.length-1].firstChild); break;
				  case 8: cubeout(list_array[list_array.length-1].firstChild); break;
				  case 9: horizontalstripout(list_array[list_array.length-1].firstChild); break;
				  case 10: verticalstripout(list_array[list_array.length-1].firstChild); break;
				 
				  default: case 11: incrementz();
			 }
	 };
	
	  function controllers()
	  {
	  var controls = "<span id='controller' class='hover'><a href='#' id='previous'></a><a href='#' id='playtoggle' class='pause'></a><a href='#' id='next'></a></span>";	 
       ul.append(controls);
	   $("#controller").hover(function(){ $(this).toggleClass('hover'); }
							 ,function(){ $(this).toggleClass('hover'); });
	   $("#previous").click(function(){ in_flag = true; decrementz(); });
	   $("#next").click(function(){ if(in_flag!=true){ 
									   in_flag = true; clearInterval(image_timer);  
									   transition();   
									   }
									   });
	   $("#playtoggle").click(function(){ $(this).toggleClass('play pause'); 
															  
		if(flag==false)
		{
			flag = true; clearInterval(image_timer);in_flag = false;
		}
		else
		{
			flag = false;in_flag = true; transition();
		}
		});
	   
	  
	   
       };
	  
	  
	 function generatethumbnails(direction)
	{
		
	var thumbs = thumbnails.find("li");
	 thumbs.addClass('thumbnail hover')
	thumbs.find("img").addClass('thumbnail');
	thumb_array = $.makeArray(thumbs);
	
	
	 
	thumbs.bind({'mouseover mouseout':function(){  $(this).toggleClass('hover');  }  ,
				  'click':function(){   $.fn.jQuad.setimage(this.firstChild.src)   }													   
																	   });
		switch(direction)
		{
		case 'down': thumbnails.addClass('down');   
	  				break;
		case 'left': thumbnails.addClass('left');   
		            break;
		case 'right':if(options.view=="maximize")
						thumbnails.addClass('maximumright');
		              else
		              thumbnails.addClass('right');
						break;
		}
	
	
	} ;
	 
	function maximize(){
		  dimension.width =$(window).width();
		  dimension.height =$(window).height();
		$("#jQuad-stage").addClass("maximum");
		
		} ;
	
	//function for spectrum transition
	function spectrumout(image)
	{
		im = $(image);
		 w = Math.floor(dimension.width/30);
		 arr = new Array();
		 var i =0;
		 var index = 0;
		 parent = im.parent();
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:w,
						height:dimension.height,
						'background-image':'url('+src+')',
						'background-attachment':'scroll'					
						}
							
							});
		 while(i<dimension.width)
		 {				
			arr[index]  = block.clone().css({ "left":i ,backgroundPosition:-i+"px 0px" });
			parent.append(arr[index++]);
			i = i + w;
		 }
		 im.hide();
		 
		 i=arr.length;
		 setTimeout(function() { fade(); },500); 
		 
		function fade()
			{
				if(i<1)
				{
					
					 incrementz();
					return;
				}
				
			if(i>=4)	
			arr[i-4].css("opacity",0.8);
			if(i>=3)
			arr[i-3].css("opacity",0.6);
			if(i>=2)
			arr[i-2].css("opacity",0.4);	
			if(i>=0)
			arr[i-1].css("opacity",0.2);	
				
		setTimeout(function() { arr[--i].remove(); fade(); },110); 
			
			};
		 
	
		}; 
		
		
	//function for cube transition	
	function cubeout(image)
	{
		 im = $(image);
		 w = Math.floor(dimension.width/5);
		 h = Math.floor(dimension.width/5);
		 parent = im.parent();
		 arr = new Array();
		 i =0;
		 j =0;
		 var index = 0;
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:w,
						height:h,
						'background-image':'url('+src+')'
						
						}
							
							});
		 while(i<dimension.width)
		 {
			
		    j=0;
			while(j<dimension.height)
			{
				
				arr[index] = block.clone().css({left:i ,top:j,backgroundPosition:-i+"px "+-j+"px" });
				parent.append(arr[index++]);
			j = j + h;
			}
			
			i = i + w;
		 }
		 im.hide();
	    i=0;
		setTimeout(function(){ doit(); },500);
		function doit(){
	    var random_no = random_array(arr.length);
		
		 var timer = setInterval(function()
		{				
		 
		 $(arr[random_no[i++]]).remove();
			
		 if(i>arr.length)
			{
				incrementz();
				clearInterval(timer);
			}
		  
		},70);
				
		};
	};	
	
	//function for cube scaling
	function cubescale(image)
	{
		 im = $(image);
		 w = Math.floor(dimension.width/5);
		 h = Math.floor(dimension.width/5);
		 parent = im.parent();
		 arr = new Array();
		 var i =0;
		 var j =0;
		 var index = 0;
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:w,
						height:h,
						'background-image':'url('+src+')'
						
						}
					        });
		 while(i<dimension.width)
		 {
			
		    j=0;
			while(j<dimension.height)
			{
				
				arr[index] = block.clone().css({left:i ,top:j,backgroundPosition:-i+"px "+-j+"px" });
				parent.append(arr[index++]);
			j = j + h;
			}
			
			i = i + w;
		 }
		 im.hide();
	    i=0;
		setTimeout(function(){ doit(); },90);
		function doit(){
	    var random_no = random_array(arr.length);
		
		 var timer = setInterval(function()
		{				
		  
		  $(arr[random_no[i++]]).hide(160,function(){  $(this).remove();  });
		 
			
		 if(i>arr.length)
			{
				incrementz();
				clearInterval(timer);
			}
		  
		},110);
				
		};
	};	
	
	//function for horizontal spectrum
	function hspectrumout(image)
	{
		 im = $(image);
		 h= Math.floor(dimension.height/30);
		 arr = new Array();
		 i =0;
		 var index = 0;
		 parent =im.parent();
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:dimension.width,
						height:h,
						'background-image':'url('+src+')'
						}
							
							});
		 while(i<dimension.height)
		 {
			arr[index]  = block.clone().css({ "top":i ,backgroundPosition:"0px "+-i+"px" });
		    parent.append(arr[index++]);
			i = i + h;
		 }
		 im.hide();
		  i=arr.length;
		 setTimeout(function() { fade(); },1000); 
		 
		function fade()
			{
				if(i<1)
				{
					// end= new Date().getTime();
					 //alert(end-start);
					 incrementz();
					return;
				}
				
			if(i>=4)	
			arr[i-4].css("opacity",0.8);
			if(i>=3)
			arr[i-3].css("opacity",0.6);
			if(i>=2)
			arr[i-2].css("opacity",0.4);	
			if(i>=0)
			arr[i-1].css("opacity",0.2);	
				
		setTimeout(function() { arr[--i].remove(); fade(); },110); 
			
			};
		 
	
		}; 
	
	//function for horizontal ease out
	function horizontaleaseout(image)
	{
		 im = $(image);
		 h= Math.floor(dimension.height/14);
		 arr = new Array();
		 i =0;
		 index = 0;
		 parent = im.parent();
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:dimension.width,
						height:h,
						'background-image':'url('+src+')'
						
						}
							
							});
		 while(i<dimension.height)
		 {
					
			arr[index]  = block.clone().css({ "top":i ,backgroundPosition:"0px "+-i+"px" });
		    parent.append(arr[index]);
			i = i + h;
			arr[index].delay(i*1.2).animate({height:0},500,function(){  $(this).remove();  });
			index++;
		 }
		 im.hide();
		  setTimeout(function(){ incrementz(); },2000);
	
		}; 
		
	//function for horizontal blind in	
	function horizontalblind(image)
	{
		 im = $(image);
		 h=  Math.floor(dimension.height/15);
		 arr = new Array();
		 var i =0;
		 index = 0;
		 parent = im.parent();
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:dimension.width,
						height:h,
						'background-image':'url('+src+')'
						
						}
							
							});
		 while(i<dimension.height)
		 {
					
				arr[index]  = block.clone().css({ "top":i ,backgroundPosition:"0px "+-i+"px" });
				 parent.append(arr[index]);
			i = i + h;
			arr[index].animate({height:0},500,function(){  $(this).remove();  });
			index++;
		 }
		im.hide();
		 setTimeout(function(){ incrementz(); },2000);		
			
	}; 
	// function for vertical blind
	function verticalblind(image)
	{
		 im = $(image);
		 w=  Math.floor(dimension.width/20);
		 arr = new Array();
		 var i =0;
		 index = 0;
		 parent = im.parent();
		 src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:w,
						height:dimension.height,
						'background-image':'url('+src+')'
						
						}
							
							});
		 while(i<dimension.width)
		 {
					
				arr[index]  = block.clone().css({ "left":i ,backgroundPosition:-i+"px 0px" });
				 parent.append(arr[index]);
			i = i + w;
			arr[index].animate({width:0},500,function(){  $(this).remove();  });
			index++;
		 }
		im.hide();
		setTimeout(function(){ incrementz(); },2000);		
			
	}; 
	
	//function for veritcal ease out
	function verticaleaseout(image)
	{
		im = $(image);
		w = Math.floor(dimension.width/17);
		if(options.view=="maximize")
		w = Math.floor(im.width()/15);
		
		arr = new Array();
		var fac,i =0;
		var index = 0;
		parent = im.parent();
		src = im.attr("src");
		block = $("<div />",{
					css:{
						position:"absolute",
						width:w,
						height:dimension.height,
						'background-image':'url('+src+')'
						}
							
							});
		 while(i<dimension.width)
		 {
					
				arr[index]  = block.clone().css({ "left":i ,backgroundPosition:-i+"px 0px" });
		    parent.append(arr[index]);
			i = i + w;
			arr[index].delay(i*1.2).animate({width:0},400,function(){  $(this).remove();  });
				index++;
		 }
		im.hide();
				  
		 setTimeout(function(){ incrementz(); },2000);
		
		}; 
	
	
	//function for horizontal strip out
	function horizontalstripout(image)
	{
		im = $(image);
		h= Math.floor(dimension.height/30);
		arr = new Array();
		var i =0;
		index = 0;
		parent = im.parent();
		src = im.attr("src");
		 block = $("<div />",{
					css:{
						position:"absolute",
						width:dimension.width,
						height:h,
						'background-image':'url('+src+')'
						
						}
							
							});
		 while(i<dimension.height)
		 {
					
				arr[index]  = block.clone().css({ "top":i ,backgroundPosition:"0px "+-i+"px" });
				 parent.append(arr[index]);
			i = i + h ;
			
			index++;
		 }
		 im.hide();
		 i=0;
		setTimeout(function(){ doit(); },1000);
		function doit(){
	    var random_no = random_array(arr.length);
		
		 var timer = setInterval(function()
		{				
		 
		 $(arr[random_no[i++]]).remove();
			
		 if(i>arr.length)
			{
				incrementz();
				clearInterval(timer);
			}
		  
		},70);
				
		};
		
	};
	
	//function for vertical strip out
	
	function verticalstripout(image)
	{
		im = $(image);
		w= Math.floor(dimension.width/30);
		arr = new Array();
		var i =0;
		index = 0;
		var parent = im.parent();
		var src = im.attr("src");
		block = $("<div />",{
					css:{
						position:"absolute",
						width:w,
						height:dimension.height,
						'background-image':'url('+src+')'
						
						}
							
							});
		 while(i<dimension.width)
		 {
					
				arr[index]  = block.clone().css({ "left":i ,backgroundPosition:-i+"px 0px" });
				 parent.append(arr[index]);
			i = i + w ;
			
			index++;
		 }
		 im.hide();
		 i=0;
		setTimeout(function(){ doit(); },1000);
		function doit(){
	    var random_no = random_array(arr.length);
		
		 var timer = setInterval(function()
		{				
		 
		 $(arr[random_no[i++]]).remove();
			
		 if(i>arr.length)
			{
				incrementz();
				clearInterval(timer);
			}
		  
		},70);
				
		};
	
		};
	
   $.fn.jQuad.setimage = function(image){
		
		   var th;
		    
			if(image.lastIndexOf('/')!=-1)
			 image = image.substr(image.lastIndexOf('/')+1,image.length-1);
			 
			for(var i=0;i<list_array.length;i++)
			{
				th = list_array[list_array.length-1].firstChild.src;
				if(th.lastIndexOf('/')!=-1)
				th = th.substr(th.lastIndexOf('/')+1,th.length-1);
				
				
				
				if(th==image)
			       break;
				else
				 incrementz();
				
			   
			}
		
		
		};
	
	 $.fn.jQuad.stopslide = function(){
		 clearInterval(image_timer);
		 };
	 $.fn.jQuad.startslide = function(){
		transition();
		 };
	 $.fn.jQuad.settransition = function(val){
		 options.type = val;
		 };	 
		 
	transition();
	
	}
	
} // end of library


function random_array(maxn)
 {
	
    var array = new Array();
	var temp,i,flag=true;
	var index =0;
	 while(index<maxn)
	 {
		 flag = true;
		 temp = Math.floor(Math.random() * maxn);
		 for(i=0;i<array.length;i++)
		 {
			 if(temp==array[i])
			 {
				flag=false;
				break;
			 }
		 }
		 
		 if(flag==true)
		 array[index++] = temp;
	 }
	 
	 return array;
 };

		  })(jQuery);
