/*-------------------------------
@Author:Murali
@version: 2.2 Final  
@Name: TCarousel
@Effects : fade||scroll||slideUp||slideDown||show||square

usage:
var TCarousel = new TCarousel('id','leftOffset','width',effectTime,'effect');
TCarousel.initialize();

build's with
1) Keyboard shortcuts.
2) Accessibility for screen readers.
3) Arrow, pagination, both controls.
4) Multiple transition effects.

 restriction : 
 1) don't use UL LI structure inside the Carousel as 
 	they are reserved for building component structure.
-----------------------------------*/

TCarousel = function(id,Xoffset,width,animationTime,effect){
	this.timer =(typeof(animationTime)!='undefined')?animationTime:6500;	
	this.carouselWidth = (typeof(width)!='undefined')?width:this.id.find("li:first").width();	
	this.xOffset = (typeof(Xoffset)!='undefined')?Xoffset:0; // specific functionality for homeEvent
	this.effect = (typeof(effect)!='undefined')?effect:"fade";  //fade||scroll||slideUp||slideDown||show||square
	this.slideCount = null;
	this.defaultSlide = 0;
	this.id = id;
	this.t = null;
	this.state = "stop";
	this.arrowDisable = false; // boolean for arrow disable to avoid infinite rotation   
	this.animate = true; // boolean  for start animation
	this.mouseOverPanel = false; 
	this.fromPagination = false; 
	this.nextPrevArrow = false; //boolean for arrow on||off
}

TCarousel.prototype.initialize = function(){  // builds structure and sets values
	var self = this;
	var containerObj=$("#"+this.id+" ul");
	containerObj.find("li:first").css("z-index","2");
	containerObj.find("li").each(function(i){			
		if(i != self.defaultSlide && self.effect == "scroll"){
			$(this).css("left", self.carouselWidth+"px");
		}else{
			$(this).css("left",self.xOffset+"px");
		}
	});
	self.slideCount = containerObj.find("li").length;
	containerObj.find("li").attr("tabindex","0")
	containerObj.find("li:last").addClass("lastSlide");
	containerObj.find("li:first").addClass("firstSlide");
	containerObj.find("li:eq("+self.defaultSlide+")").fadeIn();
	containerObj.parent().find("li").each(function(i){
		if(i != containerObj.parent().find("li").length-1){
			$(this).find("a:last, area:last").keypress(function(event){	
				if(event.keyCode == 9){
					if(!event.shiftKey){
						$("#"+self.id+" .pagination .selected").focus();
					}
				}
			})
		}
	})
	containerObj.find("li").bind("click",function(){if(self.animate){$("#"+self.id+" .play").trigger("click");}});	
	containerObj.find("li").mouseenter(function(){if(self.animate){self.mouseOverPanel=true}}).mouseleave(function(){if(self.animate){self.mouseOverPanel=false;}})
	$("#"+self.id).prepend('<div class="pagination"></div>');
	$("#"+self.id).prepend('<div class="offscreen" tabindex="0">press tab to pause panel rotation.</div>');	
	$("#"+self.id).append('<a href="javascript:void(0)" class="skipToPagination offscreen">skip to panel controls</a>');
	$("#"+self.id).append('<div class="offscreen" id="moveout" tabindex="0">moving out of panel</div>');
	
	if(self.nextPrevArrow){
		$("#"+self.id).prepend('<a href="javascript:void(0)" id="left" class="arrow">previous</a>');
		$("#"+self.id).append('<a href="javascript:void(0)" id="right"  class="arrow">next</a>');	
		containerObj.parent().find(".arrow").bind("click",function(){
			self.nextPrevBtn($(this));
		});
	}
	self.pagination();
	self.setTrans();
	self.updatePagination();
	self.setHotKey();
	$("#"+self.id+" .pagination .play").keypress(function(event){
		if(event.keyCode == 9){
			if(!event.shiftKey){
				$("#"+self.id+" .skipToPagination").focus();
				return;
			}else{
				$(this).prev().focus();
			}
		}
	});
	
	 $("#"+self.id+" .skipToPagination").click(function(){
		 $("#"+self.id+" .pagination").find("a:first").focus();
	});
};

TCarousel.prototype.setHotKey = function(){ // builds keyboard navigation  
	var self = this;
	$("#"+self.id).prepend('<div tabindex="0" class="offscreen">hotkey for navigation press 2 for next panel, 1 for previous panel, 3 for pagination</div>');
	$("#"+self.id).append('<div id="paneldata_"'+self.id+'" tabindex="0"></div>');
	$("#"+self.id).keydown(function(event){
		if(event.keyCode == 50 || event.keyCode == 98){
			if($("#"+self.id+" .pagination .selected").next().attr("id")=="play"){return}
			$("#"+self.id+" .pagination .selected").next().trigger("click");
			if($("#"+self.id+" .selected").index("#"+self.id+" .pagination a") == ($("#"+self.id+" .pagination a").length - 2)){
				$("#"+self.id+" #paneldata").html("you are in last panel");
				$("#"+self.id+" #paneldata").focus();
			}
		}else if(event.keyCode == 51 || event.keyCode == 99){
			$("#"+self.id+" .pagination a:first").focus();
		}else if (event.keyCode == 49 || event.keyCode == 97){
			if($("#"+self.id+" .pagination a.selected").hasClass("first")){return;}
			$("#"+self.id+" .pagination .selected").prev().trigger("click");
			if($(".selected").index("#"+self.id+" .paginationa") == 0){
				$("#"+self.id+" #paneldata").html("you are in first panel")
				$("#"+self.id+" #paneldata").focus();
			}
		}		
	 });
}

TCarousel.prototype.updatePagination = function(){ // pagination reset handler
	var self = this;
	$("#"+self.id+" .pagination .selected span:first").html('slide');
	$("#"+self.id+" .pagination a").removeClass("selected");
	$("#"+self.id+" .pagination").find("a:eq("+self.defaultSlide+")").addClass("selected");
	$("#"+self.id+" .pagination .selected span:first").html("current slide");
};

TCarousel.prototype.nextPrevBtn = function(handel){ // prev  & next arrow handler
	var self = this;
	var containerObj=$("#"+this.id+" ul");
	if(self.mouseOverPanel){return;}
	if(containerObj.find("li").css("z-index")==0){
		containerObj.find("li").removeAttr("style")
		containerObj.find("li").each(function(i){
			if(i!= self.defaultSlide && self.effect == "scroll"){
				$(this).css("left", self.carouselWidth+"px");
			}
		});
	}
	if(self.effect == "scroll"){if(self.state == "playing"){return;}}
	if(typeof(handel) == "undefined"){
		self.slide(self.defaultSlide,"right");
		self.defaultSlide = self.defaultSlide + 1;
	}else{
		if(handel.attr("id") == "right"){
			if(self.fromPagination){self.fromPagination=false;}
			self.slide(self.defaultSlide,"right");
			if(self.animate){
				self.defaultSlide = self.defaultSlide + 1;
			}else{
				if(!handel.hasClass("disabled")){
					self.defaultSlide = self.defaultSlide + 1;
				}
			}
		}else{
			if(!handel.hasClass("disabled")){
				if(self.fromPagination){self.fromPagination=false;}
				self.slide(self.defaultSlide,"left")
				self.defaultSlide = self.defaultSlide - 1;
			}
		}
	}
	self.updatePagination();
};

TCarousel.prototype.isQuickInfo = function(){ //Quick info check. reason:bi-pass global click bug in quickinfo  
	var self = this;
	var containerObj=$("#"+this.id+" ul");
	if(self.nextPrevArrow){
		if($("#LayersFrame").css("display")=="block" || $("#LayersFrame").css("display")=="inline"){return;}		
		containerObj.parent().find("#right").trigger("click");
	}else{
		self.nextPrevBtn();		
	}	
};

TCarousel.prototype.slide = function(x,y){ // main effect handler
	var self = this;
	var containerObj=$("#"+this.id+" ul");	
	var slidTimer= 500;
	x=(x==0)?1:x;
		obj = containerObj.find("li:eq("+ self.defaultSlide +")");
		self.state="playing";
		if (y == "right"){
			if(self.defaultSlide == (self.slideCount-1)){self.defaultSlide = -1}				
			obj1 = containerObj.find("li:eq("+(self.defaultSlide + 1)+")");
			if(self.effect == "scroll"){
				obj1.css("left",self.carouselWidth+"px");
				containerObj.find("li").css("display","block");				
				obj.animate({"left":(self.carouselWidth*-1)},slidTimer,function(){if(!self.animate){obj.focus();}})
				obj1.animate({"left":self.xOffset},slidTimer,function(){
					self.state="stop";
					for(var i=0;i<=(self.slideCount-1);i++){
						if(i!= self.defaultSlide){
							containerObj.find("li:eq("+i+")").css("display","none");							
						}
					}					
				})
			}else{
				obj = containerObj.find("li:eq("+ (self.defaultSlide+1) +")");
				self.transitionEffect(obj,slidTimer)
			}
			if(self.nextPrevArrow){
				$("#"+self.id+" #left").removeClass("disabled");
				if(x==2 && self.arrowDisable){
					$("#"+self.id+" #right").addClass("disabled");
				}else{
					$("#"+self.id+" #right").removeClass("disabled");
				}
			}
		}else{
			if(self.defaultSlide == 0){self.defaultSlide = self.slideCount}
			if(self.effect=="scroll"){
			obj1 = containerObj.find("li:eq("+(self.defaultSlide - 1)+")");
			obj1.css("left",(self.carouselWidth*-1))
			containerObj.find("li").css("display","block");
			obj.animate({"left":self.carouselWidth},slidTimer)
			obj1.animate({"left":self.xOffset},slidTimer,function(){
				self.state="stop";
				for(var i=0;i<=(self.slideCount-1);i++){
					if(i!= self.defaultSlide){
						containerObj.find("li:eq("+i+")").css("display","none");
					}
				}
			});
			if(!self.animate){obj.focus();}
			}else{
				obj = containerObj.find("li:eq("+ (self.defaultSlide-1) +")");
				self.transitionEffect(obj,slidTimer);
			}
			if(self.nextPrevArrow){
				$("#"+self.id+" #right").removeClass("disabled");
				if(x==1 && self.arrowDisable){
					$("#"+self.id+" #left").addClass("disabled");
				}
			}
		}
};
TCarousel.prototype.transitionEffect = function(obj, slidTimer){ //transition effect controller 
	var self = this;
	var containerObj=$("#"+this.id+" ul");
	if(self.effect=="slideUp"){
		containerObj.find("li").slideUp(slidTimer);
		obj.fadeIn(slidTimer,function(){if(!self.animate){obj.focus();}});
	}else if(self.effect=="slideDown"){
		containerObj.find("li").fadeOut(slidTimer);
		obj.slideDown(slidTimer,function(){if(!self.animate){obj.focus();}});
	}else if(self.effect=="fade"){
		containerObj.find("li").fadeOut(slidTimer);
		obj.fadeIn(slidTimer,function(){if(!self.animate){obj.focus();}});
	}else if(self.effect=="square"){
		containerObj.find("li").hide();
		obj.show(slidTimer,function(){if(!self.animate){obj.focus();}});
	}else{
		containerObj.find("li").css("display","none");
		obj.css("display","block");
		if(!self.animate){obj.focus();}
	}	
}

TCarousel.prototype.show = function(h){ // handles pagenation buttons and slide transitions 
	var self = this;
	var containerObj = $("#"+this.id+" ul");
	var slidTimer= 500;
	self.fromPagination=true;
	if($("#"+self.id+" .pagination").find("a:eq("+h+")").hasClass("selected")){return;}
	if(self.animate){$("#"+self.id+" .play").trigger("click");}
	if(self.nextPrevArrow){$("#"+self.id).find("#left, #right").removeClass("disabled");}
	self.defaultSlide = h;
	self.updatePagination();
	if(typeof(h)!="undefined"){
		if(self.effect == "scroll"){	
			containerObj.find("li").css({"z-index":"0","left":self.xOffset+"px","display":"none"})
			var obj = containerObj.find("li:eq("+self.defaultSlide+")");	
			self.transitionEffect(obj,slidTimer);
		}else{
			self.defaultSlide = h-1;
			self.slide(h,"right");
		}
	}
};

TCarousel.prototype.pagination = function(){ // builds pagination to MSM
	var self = this;
	var containerObj=$("#"+this.id+" ul");
	for (var i=1;i<=self.slideCount;i++){
		$("#"+self.id+" .pagination").append('<a href="javascript:void(0)" id="'+i+'_item"><span>slide </span><b>'+i+'</b><span> of '+ self.slideCount +'</span></a>');			
	}
	$("#"+self.id+" .pagination").append('<a href="javascript:void(0)" class="play" id="play">pause</a>');
	$("#"+self.id+" .pagination a:first").addClass("first");	
	$("#"+self.id+" .pagination").find("a:lt("+self.slideCount+")").each(function(i){
		$(this).click(function(){
			self.show(i);
			$(this).parent().find(".focus").removeClass("focus");
		});
	});
	$("#"+self.id+" .play").click(function(event){
		self.setTrans();
		
	})
	$("#"+self.id).find("a:first, area:first").bind("focus",function(event){if(self.animate){$("#"+self.id+" .play").trigger("click");}});
	$("#"+self.id+" .pagination a").focus(function(){$(this).addClass("focus")}).blur(function(){$(this).removeClass("focus")})
};

TCarousel.prototype.setTrans = function(){ // handles main transition on|off
	var self = this;
	if($("#"+self.id+" .pagination .play").attr("id")=="play"){
		self.t = setInterval(function(){self.isQuickInfo()},self.timer);
		$("#"+self.id+" .pagination .play").attr("id","pause");
		$("#"+self.id+" .pagination .play").html("Pause");
		if(self.fromPagination){
			self.defaultSlide = self.defaultSlide+1;
			self.fromPagination=false;
		}
		self.animate = true;
	}else{		
		clearInterval(self.t);
		$("#"+self.id+" .pagination .play").attr("id","play");
		$("#"+self.id+" .pagination .play").html("play");
		self.animate = false;
		self.mouseOverPanel=false;
	}
};
